https://wiki.sj.ifsc.edu.br/api.php?action=feedcontributions&user=Odilson&feedformat=atomMediaWiki do Campus São José - Contribuições do(a) usuário(a) [pt-br]2024-03-29T11:58:33ZContribuições do(a) usuário(a)MediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=194123RDC608072024-03-27T20:15:48Z<p>Odilson: /* PARTE 3 - Segurança com HTTPS */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:180%"> Para realizar os roteiros em casa, deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter></syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=194122RDC608072024-03-27T18:06:08Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:180%"> Para realizar os roteiros em casa, deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter></syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=194121Redes de Computadores - Laboratórios com Imunes2024-03-27T18:05:30Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
<span style="font-size:180%"> Para realizar os roteiros em casa, deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=194003RDC608072024-03-21T20:24:48Z<p>Odilson: </p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:180%"> Para realizar os roteiros em casa, deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter></syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=194002Redes de Computadores - Laboratórios com Imunes2024-03-21T20:24:34Z<p>Odilson: </p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
<span style="font-size:180%"> Para realizar os roteiros em casa, deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=194001Redes de Computadores - Laboratórios com Imunes2024-03-21T20:24:00Z<p>Odilson: </p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
<span style="font-size:180%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=194000RDC608072024-03-21T20:22:38Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:180%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter></syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193999RDC608072024-03-21T20:21:38Z<p>Odilson: </p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:180%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:</span><br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193998RDC608072024-03-21T20:17:21Z<p>Odilson: </p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo em uma máquina com sistema operacional Windows:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Baixe o [https://ubuntu.com/download Ubuntu];<br />
*#Execute o Virtualbox e adicione uma nova máquina virtual (Máquina > Novo);<br />
*#Irá abrir um janela do VirtualBox para Criar Máquina Virtual, preencha corretamente os campos e clique em Próximo > Próximo > Próximo > Finalizar;<br />
*#Preencha adequadamente os campos para instalação do SO Ubuntu. Em geral deixe as opções padrão.<br />
*#Aguarde o término da instalação da máquina virtual.<br />
*#Ao terminar sua máquina virtual estará pronta para uso, execute-a e siga os passos abaixo.<br />
<br />
*<span style="font-size:180%">Instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193994Redes de Computadores - Laboratórios com Imunes2024-03-21T19:18:19Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193992RDC608072024-03-21T19:17:37Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Chrome e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes no Wireshark;<br />
##abra em uma nova aba do navegador a seguinte URL: http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193990Redes de Computadores - Laboratórios com Imunes2024-03-21T17:00:21Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox e acesse a Wiki com ele;<br />
##inicie o navegador Chrome, para realizar os experimentos, e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193989RDC608072024-03-21T16:59:37Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox e acesse a Wiki com ele;<br />
##inicie o navegador Chrome, para realizar os experimentos, e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, no terminal digite:<syntaxhighlight lang=bash><br />
sudo wireshark<br />
</syntaxhighlight><br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193988RDC608072024-03-21T16:57:24Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox e acesse a Wiki com ele;<br />
##inicie o navegador Chrome, para realizar os experimentos, e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193987Redes de Computadores - Laboratórios com Imunes2024-03-21T16:56:09Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox e acesse a Wiki com ele;<br />
##inicie o navegador Chrome, para realizar os experimentos, e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193986RDC608072024-03-21T16:55:02Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox e acesse a Wiki com ele;<br />
##inicie o navegador Chrome, para realizar os experimentos, e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193985RDC608072024-03-21T16:54:34Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox e acesse a Wiki com ele;<br />
##inicie o navegador Chrome para os experimentos e limpe o cache do mesmo (teclas de atalho:'''Ctrl + Shift + R''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193981Redes de Computadores - Laboratórios com Imunes2024-03-21T13:35:52Z<p>Odilson: /* Sobre o analisador Wireshark */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193980RDC608072024-03-21T13:35:40Z<p>Odilson: /* Sobre o analisador Wireshark */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193975RDC608072024-03-21T00:52:19Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193974Redes de Computadores - Laboratórios com Imunes2024-03-21T00:52:04Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193973Redes de Computadores - Laboratórios com Imunes2024-03-21T00:51:30Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193972RDC608072024-03-21T00:50:36Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. [[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).<br />
<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193971RDC608072024-03-21T00:48:48Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193970Redes de Computadores - Laboratórios com Imunes2024-03-21T00:47:19Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''' ou '''Ctrl + Shift + R''') ou use uma aba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193969Redes de Computadores - Laboratórios com Imunes2024-03-21T00:30:21Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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. <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193968Redes de Computadores - Laboratórios com Imunes2024-03-20T23:57:06Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193967Redes de Computadores - Laboratórios com Imunes2024-03-20T23:56:17Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193966RDC608072024-03-20T23:34:38Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193965Redes de Computadores - Laboratórios com Imunes2024-03-20T23:34:31Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte:<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
<Enter> <Enter><br />
</syntaxhighlight><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br<br />
<Enter>/<Enter><br />
</syntaxhighlight> <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193964RDC608072024-03-20T23:29:00Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<método> <url> <protocolo>/<versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <enter> <enter></enter></enter></versão></protocolo></url></método><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter>/<enter></enter></enter><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193963RDC608072024-03-20T23:27:55Z<p>Odilson: Desfeita a edição 193959 de Odilson (Discussão)</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<método> <url> <protocolo>/<versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <enter> <enter></enter></enter></versão></protocolo></url></método><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter>/<enter></enter></enter><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193962RDC608072024-03-20T23:26:56Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<método> <url> <protocolo>/<versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <enter> <enter></enter></enter></versão></protocolo></url></método><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter>/<enter></enter></enter><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193961Redes de Computadores - Laboratórios com Imunes2024-03-20T23:25:58Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<método> <url> <protocolo>/<versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <enter> <enter></enter></enter></versão></protocolo></url></método><br />
## Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?</span><br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <enter>/<enter></enter></enter><br />
## <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Seja rápido</span>. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <enter> <enter></enter></enter><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?</span><br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193960Redes de Computadores - Laboratórios com Imunes2024-03-20T23:25:23Z<p>Odilson: /* Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Seja rápido. Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193959RDC608072024-03-20T18:41:33Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193958RDC608072024-03-20T17:30:34Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193957Redes de Computadores - Laboratórios com Imunes2024-03-20T17:30:03Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''') ou use uma baba anônima;<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193956RDC608072024-03-20T16:36:55Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193955Redes de Computadores - Laboratórios com Imunes2024-03-20T16:36:24Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox (um diferente do que usa para acessar a Wiki);<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193954Redes de Computadores - Laboratórios com Imunes2024-03-20T16:35:18Z<p>Odilson: /* A Interação Básica GET/Resposta do HTTP */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador Firefox;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RED1-EngTel_(p%C3%A1gina)&diff=193863RED1-EngTel (página)2024-03-11T23:02:38Z<p>Odilson: /* Softwares */</p>
<hr />
<div>{{DivulgueEngtelecom}}<br />
<br />
==[[RED1-EngTel|Carga horária, Ementas, Bibliografia]]==<br />
==[[Cronograma de atividades (RED1-EngTel) | Cronograma de atividades ]]==<br />
==[[RED1-EngTel (Plano de Ensino) | Plano de Ensino]]==<br />
<br />
=Edições=<br />
*[[RED29004-Laboratórios_com_Imunes|RED29004 2020 em diante - Prof. Odilson T. Valle]]<br />
*[[RED29004-Laboratórios|RED29004 2020-1 - Prof. Odilson T. Valle]]<br />
*[[RED29004-Laboratórios|RED29004 2019-1 - Prof. Tiago Semprebom]]<br />
*[[RED29004-Laboratórios|RED29004 2018-2 - Prof. Odilson T. Valle]]<br />
*[[RED29004-Laboratórios|RED29004 2018-1 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2017-2|RED29004 2017-2 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2017-1|RED29004 2017-1 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2016-2|RED29004 2016-2 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2016-1|RED29004 2016-1 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2015-2|RED29004 2015-2 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2015-1|RED29004 2015-1 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2014-2|RED29004 2014-2 - Prof. Odilson T. Valle]]<br />
*[[RED29004-2014-1|RED29004 2014-1 - Prof. Arliones Hoeller]]<br />
*[[RED29004-2013-2|RED29004 2013-2 - Prof. Tiago Semprebom]]<br />
<br />
= Material de apoio =<br />
<!--<br />
==Roteiros de laboratório==<br />
#[[RED29004-Laboratórios com Imunes#Ferramentas_b.C3.A1sicas:_Ping_e_Traceroute | Ferramentas Básicas: Ping e Traceroute]]<br />
#[[RED29004-Laboratórios com Imunes#Ferramentas_b.C3.A1sicas:_WireShark_e_tcpdump | Ferramentas básicas: WireShark e tcpdump]]<br />
#[[RED29004-Laboratórios com Imunes#Desvendando_o_HTTP_com_Wireshark | Desvendando o HTTP com Wireshark]]<br />
#[[RED29004-Laboratórios com Imunes#Desvendando_o_HTTP_com_Wireshark.2C_parte_2 | Desvendando o HTTP com Wireshark - Parte 2]]<br />
#[[RED29004-Laboratórios com Imunes#Servi.C3.A7o_de_Nomes_.28DNS.29 | Serviço de Nomes (DNS)]]<br />
#[[RED29004-Laboratórios com Imunes#Comparando_sockets_UDP_e_TCP | Comparando sockets UDP e TCP]]<br />
#[[RED29004-Laboratórios com Imunes#TCP_x_UDP | TCP x UDP]]<br />
#[[RED29004-Laboratórios com Imunes#Desvendando_o_TCP_-_N.C3.BAmero_de_Sequ.C3.AAncia.2C_Controle_de_Erros.2C_transmiss.C3.A3o_duplex | Desvendando o TCP - Número de Sequência, Controle de Erros, transmissão ''duplex'']]<br />
#[[RED29004-Laboratórios com Imunes#TCP:_Controle_de_congestionamento_e_equidade | TCP: Controle de congestionamento e equidade]]<br />
#[[RED29004-Laboratórios com Imunes#Interliga.C3.A7.C3.A3o_de_duas_redes_atrav.C3.A9s_de_um_roteador | Interligação de duas redes através de um roteador]]<br />
#[[RED29004-Laboratórios com Imunes#Tabelas_Est.C3.A1ticas_de_Roteamento | Tabelas Estáticas de Roteamento]]<br />
#[[RED29004-Laboratórios com Imunes#Protocolos_de_roteamento_din.C3.A2micos_-_RIP_e_OSPF | Protocolos de roteamento dinâmicos - RIP e OSPF]]<br />
#[[RED29004-Laboratórios com Imunes#Neighbor_Discovery_e_roteamento_est.C3.A1tico_no_IPv6 | ''Neighbor Discovery'' e roteamento estático no IPv6]]<br />
--><br />
<br />
== Listas de exercícios==<br />
<br />
{{Collapse top |Lista de exercícios 1 - Introdução}}<br />
<br />
#Qual é a diferença entre um hospedeiro e um sistema final? Cite os tipos de sistemas finais. Um servidor web é um sistema final? <br />
#O que caracteriza um protocolo? Dê um exemplo de um protocolo.<br />
#Por que os padrões são importantes para os protocolos?<br />
#O que é um programa cliente? O que é um programa servidor? Um programa servidor requisita e recebe serviços de um programa cliente? <br />
#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. <br />
#Quais são as vantagens de uma rede de comutação de circuitos em relação a uma rede de comutação de pacotes? <br />
#Quais são os prós e contras da utilização de Circuitos Virtuais? <br />
#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.<br />
#Cite seis tecnologias de acesso. Classifique cada uma delas nas categorias acesso residencial, acesso corporativo ou acesso móvel. <br />
#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.<br />
#Cite tecnologias de acesso residencial disponíveis na grande Florianópolis. Para cada tipo de acesso, apresente a taxa de ''downstream'', a taxa de ''upstream'' e o preço mensal anunciados.<br />
#Qual é a taxa de transmissão de LANs Ethernet?<br />
#Qual é a vantagem de uma rede de comutação de circuitos em relação a uma de comutação de pacotes? Quais são as vantagens da TDM sobre a FDM em uma rede de comutação de circuitos?<br />
#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?<br />
#Suponha que o hospedeiro A queira enviar um arquivo grande para o hospedeiro B. O percurso de A para B possui três enlaces, de taxas <math>R_1 = 500 kbps, R_2 = 2 Mbps e R_3 = 1 Mbps</math>.<br />
##Considerando que não haja nenhum outro tráfego na rede, qual é a vazão para a transferência de arquivo?<br />
##Suponha que o arquivo tenha 4 milhões de bytes. Quanto tempo levará a transferência do arquivo para o hospedeiro B?<br />
##Repita os itens 1 e 2, mas agora com <math>R_2</math> reduzido para 100 kbits/s.<br />
#Porque dividimos a arquitetura da Internet em camadas? <br />
#Quais são as cinco camadas da pilha de protocolo da Internet? Quais as principais responsabilidades de cada uma dessas camadas? <br />
#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?<br />
#Que camadas da pilha de protocolo da Internet um roteador implementa? Que camadas um comutador de enlace implementa? Que camadas um sistema final implementa?<br />
#A noção de portas é criada pela camada de transporte na arquitetura TCP/IP. Qual a funcionalidade que as portas permitem implementar?<br />
#Considere uma aplicação que transmita dados a uma taxa constante (por exemplo, a origem gera uma unidade de dados de N bits a cada k unidades de tempo, onde k é pequeno e fixo). Considere também que, quando essa aplicação começa, continuará em funcionamento por um período de tempo relativamente longo. Responda às seguintes perguntas, dando uma breve justificativa para suas repostas.<br />
##O que seria mais apropriado para essa aplicação: uma rede de comutação de circuitos ou uma rede de comutação de pacotes? Por quê?<br />
##Suponha que seja usada uma rede de comutação de pacotes e que o único tráfego venha de aplicações como a descrita anteriormente. Além disso, imagine que a soma das velocidades de dados da aplicação seja menor do que a capacidade de cada enlace. Será necessário algum tipo de controle de congestionamento? Por quê?<br />
#Imagine que você queira enviar, com urgência, 40 terabytes de dados de São José a Manaus. Você tem disponível um enlace dedicado de 100 Mbps para a transferência de dados. Você escolheria transferir os dados pelo enlace ou mandar mídias por Sedex 10? Explique.<br />
#Suponha que dois hospedeiros, A e B, estejam separados por uma distância de 20000 km e conectados por um enlace direto de R = 2 Mbps. Suponha que a velocidade de propagação pelo enlace seja de <math>2,5.10^8 m/s</math>.<br />
##Considere o envio de um arquivo de 800 mil bits do hospedeiro A para o hospedeiro B. Suponha que o arquivo seja enviado continuamente, como se fosse uma única grande mensagem. Qual o número máximo de bits que estará no enlace a qualquer dado instante?<br />
##Qual é o comprimento (em metros) de um bit no enlace? É maior do que o de um campo de futebol?<br />
##Considere o envio de um arquivo de 800 mil bits do hospedeiro A para o hospedeiro B. Suponha que o arquivo seja enviado continuamente, como se fosse uma única grande mensagem. Qual o número máximo de bits que estará no enlace a qualquer dado instante, mas agora com o enlace de R = 1 Gbps?<br />
##Qual é o comprimento (em metros) de um bit no enlace, mas agora com o enlace de R = 1 Gbps?<br />
## Quanto tempo demora para mandar o arquivo, admitindo que ele seja enviado continuamente?<br />
##Suponha agora que o arquivos seja fragmentado em 20 pacotes e que cada um contenha 40 mil bits. Imagine que cada pacote seja verificado pelo receptor e que o tempo de verificação de um pacote seja desprezível. Por fim, admita que o emissor não possa enviar um novo pacote até que o anterior tenha sido reconhecido por um ACK (''acknowledged'') de 500 bits. Quanto tempo demorará para ser enviado o arquivo?<br />
##Compare os tempos em ambos os casos, fragmentado e não.<br />
{{Collapse bottom}}<br />
<br />
{{Collapse top |Lista de exercícios 2 - Camada de Aplicação}}<br />
#Relacione cinco aplicações da Internet não proprietárias e os protocolos da camada de aplicação que elas usam. <br />
#Qual é a diferença entre arquitetura de rede e arquitetura de aplicação? <br />
#De que modo um mensageiro instantâneo é um híbrido das arquiteturas cliente-servidor e P2P? <br />
#Para uma sessão de comunicação entre um par de processos, qual processo é o cliente e qual é o servidor? <br />
#Que informação é usada por um processo que está rodando em um hospedeiro para identificar um processo que está rodando em outro hospedeiro? <br />
#Porque o HTTP, FTP, SMTP, POP3 e IMAP rodam sobre TCP e não sobre UDP? <br />
#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ê?<br />
#Por que se diz que o FTP envia informações de controle “fora da banda”? <br />
#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.<br />
#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? <br />
#A noção de portas é criada pela camada de transporte na arquitetura TCP/IP. Qual a funcionalidade que as portas permitem implementar?<br />
#Descreva todo o processo de ''download'' de um arquivo utilizando a ferramenta Bittorrent. Considere que o usuário acabou de instalar a mesma.<br />
#Relacione alguns agentes de usuário de aplicação de rede que você utiliza no dia-a-dia. <br />
#O que significa o protocolo de apresentação (handshaking protocol)? <br />
#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. <br />
#Descreva uma aplicação que requeira “não perda de dados” e seja também altamente sensível ao atraso.<br />
<br />
ADICIONAIS PARTE 2 - HTTP<br />
<br />
#Cite pelo menos dois clientes http.<br />
#O que é o servidor Apache?<br />
#O protocolo http deve se executar em todos os roteadores do caminho entre cliente e servidor? Explique.<br />
#Se um hospedeiro colocar um pacote de aplicação HTTP diretamente na rede física ele chegará a seu destino?<br />
#Considere que um cliente acessa uma página HTML de servidor WEB e nesta página existem dois links para dois objetos JPG que residem no mesmo servidor. Quantos comandos GETS no total deveriam ser realizados pelo cliente? Todos eles serão realizados sobre a mesma conexão TCP?<br />
#Em uma página HTML pode existir um link para um objeto que esteja armazenado em outro site? O que o browser deve fazer neste caso? <br />
#No pacote http de resposta de um servidor normalmente existem duas partes. Quais são elas?<br />
#Imagine que uma página html está sendo mostrada para o usuário cliente. Se o usuário pedir para que a página seja atualizada, o browser vai requisitar o objeto novamente? O servidor vai retornar o objeto mesmo que ele não tenha sido alterado?<br />
#O que é um cookie? 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.<br />
#Qual é a diferença entre HTTP persistente com ''pipelining'' e HTTP persistente sem ''pipelining''. Qual dos dois é utilizado pelo HTTP/1.1? <br />
#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ê? <br />
#Um servidor Web, quando recebe uma requisição necessita saber para qual porta deve responder na máquina requisitante? Se positivo, esta porta seria sempre a mesma?<br />
#Por que um servidor Web espera na porta TCP número 80 em geral?<br />
#O que é um proxy Web server?<br />
#Um browser pode fazer cache local? Qual a diferença entre cache local e cache em um servidor proxy?<br />
<br />
ADICIONAIS PARTE 3 - DNS<br />
<br />
#Porque o DNS não é centralizado? <br />
#O que são consultas recursivas e interativas em uma consulta DNS? <br />
#Quais os três tipos de servidores DNS?<br />
#Em um hospedeiro normalmente existe pelo menos um servidor DNS configurado. Que servidor deve estar configurado? Onde ele se localiza normalmente?<br />
#Quando um servidor local não consegue resolver um endereço IP olhando em seu cache, para quem ele deve encaminhar a consulta?<br />
#Um servidor sempre sabe resolver um nome solicitado? Explique.<br />
#É possível que um servidor DNS local seja um servidor com autoridade?<br />
#O que é um nome canônico e um apelido no contexto de DNS?<br />
#O que é e qual o formato de uma RR?<br />
#Explique os seguintes tipos de RR: A, NS, CNAME, MX e PTR.<br />
#Em um comando ping www.ifsc.edu.br quantas transações no mínimo serão realizadas até o último ECHO REPLY?<br />
#Por que um ping normalmente realiza uma consulta PTR?<br />
#Faça um esquema mostrando uma consulta de um cliente a um servidor local mostrando uma consulta interativa entre o servidor raiz e recursiva com um servidor de autoridade. <br />
#Cite o nome de servidor DNS bastante utilizado.<br />
#Quantos servidores raízes temos no mundo? Qual comando permite que possamos "ver" estes servidores em um hospedeiro?<br />
#Foi realizado um comando '''dig www.ifsc.edu.br''' tendo sido retornado: <br />
#:<br />
#: www.ifsc.edu.br. 240 IN A 200.135.190.95<br />
#:<br />
#Em seguida foi realizado um '''dig ifsc.edu.br MX''' com resposta:<br />
#:<br />
#: ;; ANSWER SECTION:<br />
#: ifsc.edu.br. 1327 IN MX 15 zimbra.ifsc.edu.br.<br />
#: <br />
#: ;; AUTHORITY SECTION:<br />
#: ifsc.edu.br. 2082 IN NS ns1.ifsc.edu.br.<br />
#: ifsc.edu.br. 2082 IN NS adns1.pop-sc.rnp.br.<br />
#: ifsc.edu.br. 2082 IN NS ns2.ifsc.edu.br.<br />
#: ifsc.edu.br. 2082 IN NS adns2.pop-sc.rnp.br.<br />
#: <br />
#: ;; ADDITIONAL SECTION:<br />
#: zimbra.ifsc.edu.br. 78 IN A 200.135.190.2<br />
#:<br />
#O que se pode concluir sobre a resolução do nome baseando-se nestas respostas?<br />
{{Collapse bottom}}<br />
<br />
{{Collapse top |Lista de exercícios 3 - Camada de Transporte}}<br />
#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? <br />
#Descreva porque um desenvolvedor de aplicação pode escolher rodar uma aplicação sobre UDP em vez de sobre TCP. <br />
#É 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? <br />
#Porque se diz que o TCP oferece comunicação lógica entre os processos de aplicação? <br />
#Cite quais são os serviços oferecidos pelo protocolo TCP? <br />
#O que são os serviços de multiplexação e demultiplexação implementados pela camada de transporte? <br />
#Porque se diz que o UDP é um protocolo não orientado para conexão? <br />
#Qual o papel das informações de porta origem e destino contidas nos segmentos TCP e UDP? <br />
#Porque é dito que o TCP fornece transferência confiável de dados sobre um canal não confiável?<br />
#Cite 3 diferenças entre os serviços oferecidos pelo TCP e UDP.<br />
#O que é um ''timeout''?<br />
#Como é estabelecido o valor de ''timeout'' em uma conexão TCP? É um valor fixo?<br />
#O que é um ''round trip time'' (RTT)? Escreva e descreva a equação.<br />
#Para que serve um ''checksum'' em um segmento TCP ou UDP? Como ele é formado?<br />
#Cite uma vantagem da abordagem Volta-N com relação à retransmissão seletiva.<br />
#Cite uma vantagem da abordagem Retransmissão Seletiva com relação ao Volta-N.<br />
#Qual é a grande desvantagem de uma transmissão do tipo “para e espera” com relação a uma do tipo “janelas deslizantes”?<br />
#O que é um PDU (também chamado de Segmento)?<br />
#O TCP oferece garantias de banda e de tempo real?<br />
#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.<br />
#Para que serve um ''timeout'' em um protocolo de transmissão confiável?<br />
#Cite um problema que pode ocorrer caso o valor do ''timeout'' seja muito pequeno.<br />
#Cite um problema que pode ocorrer caso o valor do ''timeout'' seja muito grande.<br />
#Por quê os tempos dos ''timeouts'' não são estabelecidos de forma estática, e sim de forma dinâmica, calculados conforme os ''round-trip times'' medidos?<br />
#O que é uma reconhecimento cumulativo?<br />
#Explique o que faz um receptor caso receba um pacote fora de ordem em um protocolo do tipo:<br />
##Volta-N e <br />
##Retransmissão Seletiva.<br />
#O que é um “Tamanho de Janela” em um protocolo do tipo Janela Deslizante? O que se leva em consideração para calcular seu valor no protocolo TCP?<br />
#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”?<br />
#Responda verdadeiro e falso as seguintes perguntas e justifique resumidamente sua resposta:<br />
##Com o protocolo GBN, é possível o remetente receber um ACK para um pacote que caia fora de sua janela corrente.<br />
##Com o protocolo SR, é possível o remetente receber um ACK para um pacote que caia fora de sua janela corrente.<br />
##O protocolo bit alternante é o mesmo que o protocolo GBN com janela do remetente e destinatário de tamanho 1.<br />
##O protocolo bit alternante é o mesmo que o protocolo SR com janela do remetente e destinatário de tamanho 1.<br />
#Considere a transferência de um arquivo enorme de L bytes do hospedeiro A para o hospedeiro B. Suponha um MSS de 536 bytes.<br />
##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.<br />
##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.<br />
#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. [[Arquivo:MaqEstadosRdt2Remetente.png|thumb|500px|Transmissor]] [[Arquivo:MaqEstadosRdt2Destinatario.png|thumb|500px|Receptor]]<br />
#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.<br />
##Qual é o complemento de 1 para a soma dessas palavras? Mostre todo o trabalho.<br />
##Por que o UDP toma o complemento de 1 da soma, isto é, por que não toma apenas a soma?<br />
##Com o esquema de complemento de 1, como o destinatário detecta erros?<br />
##É possível que o erro de 1 bit passe desapercebido?<br />
##E um de 2 bits?<br />
#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.<br />
##Quais os intervalos de tempo em que a partida lenta do TCP está em execução?<br />
##Quais os intervalos de tempo em que a prevenção de congestionamento do TCP está em execução?<br />
##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?<br />
##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?<br />
##Qual é o valor de ''sstrhresh'' na primeira rodada de transmissão?<br />
##Qual é o valor de ''sstrhresh'' na 18a rodada de transmissão?<br />
##Qual é o valor de ''sstrhresh'' na 24a rodada de transmissão?<br />
##Durante qual rodada de transmissão é enviado o 70o segmento?<br />
##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''?<br />
##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?<br />
##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?<br />
[[Arquivo:JanelaCongestionamento.png|thumb|500px|Variação do tamanho da janela]]<br />
<br />
{{Collapse bottom}}<br />
<br />
{{Collapse top |Lista de exercícios 4 - Camada de Rede}}<br />
#Quais são as principais características de uma rede de circuito virtual?<br />
#Quais são as principais características de uma rede de datagramas? <br />
#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?<br />
#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?<br />
#O que é um protocolo de roteamento?<br />
#Como podem ser classificados os algoritmos de roteamento?<br />
#Roteadores possuem endereços IP? Quantos endereços IP um roteador possui?<br />
#Qual é a diferença básica entre protocolos de roteamento “Estado de Enlaces” e “Vetor de Distância”?<br />
#Explique o funcionamento de um algoritmo de roteamento do tipo “Vetor de Distâncias”. <br />
#A Internet usa o conceito de “roteamento hierárquico”. O que significa isso? <br />
#Um roteador em uma rede de pacotes (como é o caso da Internet) pode eventualmente necessitar descartar um datagrama. Por que isso ocorre? <br />
#Um roteador em uma rede de pacotes (como é o caso da Internet) pode eventualmente necessitar fragmentar um datagrama. Por que isso ocorre? <br />
#O que é um Sistema Autônomo (AS)? <br />
#Para que serve o protocolo ICMP? <br />
#Para que serve o campo “Time to Live” (sobrevida) em um datagrama IP? <br />
#Por que são usados protocolos inter-AS e intra-AS diferentes na Internet?<br />
#Por que considerações políticas/econômicas não são tão importantes para protocolos intra-AS, como OSPF e RIP, quanto para um protocolo de roteamento inter-AS, como BGP?<br />
#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?<br />
#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?<br />
#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:<br />
##Qual o endereço identificador de rede de cada sub-rede (1, 2 e 3)?<br />
##Qual o a máscara de rede de cada sub-rede (1, 2 e 3)?<br />
##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)[[Arquivo:CdrEx.png]]<br />
#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.<br />
##Determine o tamanho total do bloco de endereços.<br />
##Determine o tamanho de cada sub-bloco.<br />
##Determine o endereço/máscara de rede de cada sub-rede.<br />
#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:<br />
##Qual o total de endereços que dispõe o provedor em questão?<br />
##Quantos endereços IP já estão utilizados?<br />
##Quantos endereços IP este provedor possui livres para alocar aos novos clientes?<br />
##Qual o endereço identificador de cada sub-rede dos novos clientes?<br />
##Qual o a máscara de rede de cada sub-rede dos novos clientes?<br />
##Qual o endereço de broadcast de cada sub-rede dos novos clientes?<br />
##Quantos endereços IP ainda sobrarão ao provedor após atender a estes clientes?<br />
#Quantas estações uma rede 223.1.10.0/24 suporta? <br />
#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.<br />
#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.<br />
#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?<br />
#Um datagrama enviado para uma estação da mesma rede precisa passar por um roteador? Explique.<br />
#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.<br />
#Descreva e detalhe o processo de obtenção de um endereço IP através do protocolo DHCP.<br />
#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.<br />
#Compare os campos de cabeçalho do IPv4 e do IPv6e aponte suas diferenças. Eles tem algum campo em comum?<br />
#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.<br />
#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:<table border="1" cellpadding="2"><br />
<tr><th>Prefixo a comparar</th><th>Interface</th><br />
<tr><th>1</th><td>0</td><br />
<tr><th>10</th><td>1</td><br />
<tr><th>111</th><td>2</td><br />
<tr><th>senão</th><td>3</td><br />
</table> 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.<br />
{{Collapse bottom}}<br />
<br />
{{Collapse top |Lista de exercícios 5 - Camada de Enlace e Redes Multimídia}}<br />
#Quais são os serviços providos pela camada de enlace?<br />
#Dentre os serviços de camada de enlace, quais obrigatoriamente precisam ser implementados por todos os protocolos de enlace?<br />
#Porque é necessário sincronizar quadros (serviço de enquadramento)?<br />
#Por que se faz necessário um protocolo de acesso ao meio (MAC), em redes com meio de transmissão compartilhado?<br />
#Do ponto de vista do protocolo MAC CSMA/CD, qual a principal diferença entre hubs e switches?<br />
#Se as redes Ethernet atualmente podem operar com switches (Ethernet comutada), e em modo fullduplex, porque ainda existe o protocolo MAC CSMA/CD?<br />
#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?<br />
#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.<br />
#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?<br />
#Compare as estruturas de quadros das redes Ethernet 10BaseT, 100BaseT e Gigabit Ethernet. Quais diferenças entre elas?<br />
#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?<br />
#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.<br />
#Suponha que João esteja assistindo um vídeo de 3 Mbits/s, Maria esteja vendo uma nova imagem de 100 Kbytes a cada 30 segundos e José esteja ouvindo um fluxo de áudio a 200 kbits/s. Sabendo que o tempo de sessão para todos os usuários seja de 1000 segundos. Monte uma tabela comparativa contento a taxa de bits e o total de bytes transferidos para esses três usuários. Qual fluxo consome mais banda?<br />
#Aplicações de multimídia podem ser classificados em três categorias. Relacione e descreva cada uma dessas categorias.<br />
#CDNs geralmente adotam uma de duas filosofias de posicionamento de servidor diferentes. Relacione e descreva resumidamente essas duas filosofias.<br />
#Qual a diferença de atraso fim a fim e variação de atraso de pacote? Quais os fatores causadores de um e outro?<br />
#Por que um pacote recebido após seu tempo de reprodução programado é considerado perdido?<br />
#Qual é o papel de um registro SIP?<br />
{{Collapse bottom}}<br />
<br />
== Transparências utilizadas durante as aulas == <br />
[http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%201%20Redes%20de%20computadores%20e%20a%20Internet.pdf Slides do Kurose referentes ao capítulo 1]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%202%20Camada%20de%20aplica%C3%A7%C3%A3o.pdf Slides do Kurose referentes ao capítulo 2]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/Aplicacoes.pdf Slides do Prof. Emerson - DNS, FTP, Web, Email...]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%207%20Redes%20multim%C3%ADdia.pdf Slides do Kurose referentes ao capítulo 7]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Slides do Kurose referentes ao capítulo 3] e [http://docente.ifsc.edu.br/odilson/RED29004/Kurose_cap03.pdf versão antiga]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%204%20A%20camada%20de%20REDE.pdf Slides do Kurose referentes ao capítulo 4]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf Slides do IPv6]<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%205%20Camada%20de%20enlace.pdf Slides do Kurose referentes ao capítulo 5]<br />
<br />
== Softwares ==<br />
* [http://imunes.net/ Imunes] Simulador/Emulador de redes (''Integrated Multiprotocol Network Emulator/Simulator'')<br />
* [[Netkit2]]: possibilita criar experimentos com redes compostas por máquinas virtuais Linux.<br />
* Vários [http://wiki.netkit.org/index.php/Labs_Official laboratórios virtuais do NetKit], prontos para uso, que focam em serviços específicos de redes de computadores.<br />
* [http://ipv6.br/pagina/livro-ipv6/ Laboratórios de IPv6 baseado no ''CORE'']<br />
* [http://www.davidc.net/sites/default/subnets/subnets.html Calculadora visual de sub-redes]<br />
<br />
=Curiosidades=<br />
<br />
* [http://www.pop-sc.rnp.br/publico/monitoramento.php Monitoramento do tráfego RNP - PoP-SC]<br />
* [https://www.rnp.br/sistema-rnp/ferramentas/panorama-de-trafego Monitoramento do tráfego RNP - Nacional]<br />
* [http://www.redclara.net/index.php/pt/red/redclara/topologia-actual-de-la-red Rede Clara Internacional]<br />
* [https://eventos.rnp.br/sites/default/files/activity/activity-presentation/apresentacao_wrnp_2017_eduardo_grizenid_v_1.2.pdf Futura infraestrutura de rede da RNP]<br />
* [https://http2.akamai.com/demo Comparativo HTTP/1.1 vs HTTP/2]<br />
* [https://www.youtube.com/watch?v=IlAJJI-qG2k Animated map shows the undersea cables that power the internet]<br />
* [https://submarine-cable-map-2019.telegeography.com/ Submarine Cable Map 2019]<br />
* [https://www.bbc.com/portuguese/geral-50162526 A pré-história da internet]<br />
* [https://www.youtube.com/watch?v=9hIQjrMHTv4 ''History of the Internet'']<br />
* [https://www.youtube.com/watch?v=A5dD2x2iQx8 ''History of the Internet'' - legendado]<br />
* [https://www.youtube.com/watch?v=PBWhzz_Gn10 ''Warriors of the Net'']<br />
* [https://www.youtube.com/watch?v=O_xG0ay5Vqs ''Warriors of the Net'' - legendado]<br />
* [https://www.youtube.com/watch?v=VANORrzKX50 ''Browser Wars'']<br />
* [https://www.youtube.com/watch?v=1G3SUTmioQE ''Browser Wars'' - legendado]<br />
* [https://www.youtube.com/watch?v=0nz-lcuv3TM ''Browser Wars'' - dublado]<br />
* [https://db-ip.com/200.135.37.65 Localização geográfica de IPs]<br />
* [http://ipv6.br/ '''IPv6 no Brasil''']<br />
* [https://www.youtube.com/watch?v=5OtebbSnwoM Fragmentação no IPv4 e IPv6]<br />
* [http://ipv6.br/lab/ Laboratório de IPv6 - Livro didático contendo vários roteiros para entendimento do IPv6]<br />
* [https://www.google.com/intl/pt-BR/ipv6/statistics.html#tab=per-country-ipv6-adoption&tab=per-country-ipv6-adoption Estatísticas Google sobre IPv6]<br />
* [https://http2.github.io/faq/#will-http2-replace-http1x HTTP/2 Frequently Asked Questions]<br />
* [https://www.youtube.com/watch?v=8XxeAw_d-BI Iniciação à máquinas de estados]<br />
<br />
=Seminários=<br />
<br />
* Objetivos:<br />
** Aprofundamento teórico em algum tema atual e relevante.<br />
** Confecção de um relatório de trabalho no estilo científico.<br />
** Apresentação de um trabalho científico.<br />
<br />
* Avaliação:<br />
** Conceito: 0,5 x Nota atribuída ao relatório + 0,5 x Nota atribuída a apresentação do seminário<br />
** [http://docente.ifsc.edu.br/odilson/RED29004/Criterios%20de%20avaliacao%20dos%20relatorios%20e%20apresentacao.pdf Critérios de avaliação]<br />
<br />
* ''Instruções sobre o Seminário de Redes I'':<br />
** 2 alunos por equipe.<br />
** 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.<br />
** O relatório pode ser redigido como uma página da wiki ou em PDF gerado por editores/diagramadores de texto do tipo LaTeX ([https://www.overleaf.com?r=f1c329a2&rm=d&rs=b Online LaTeX Editor Overleaf]) ou outro editor qualquer.<br />
*** Detalhes e conteúdo mínimo exigido baseado no [http://docente.ifsc.edu.br/odilson/RED29004/modelo_relatorio.pdf modelo de relatório].<br />
*** Se desejar fazer em LaTeX (<span style="color: red;"> RECOMENDADO<span style="color: black;">) inscreva-se em [https://www.overleaf.com?r=f1c329a2&rm=d&rs=b Overleaf] e siga (copie) o [https://github.com/emersonmello/modelos-latex].</span></span><br />
*** Um exemplo de bom relatório [http://docente.ifsc.edu.br/odilson/RED29004/IPv6_relatorio_modelo.pdf].<br />
** Duração da apresentação: 20 minutos (limitantes: 15 a 25 minutos) + 5 minutos de perguntas, [http://docente.ifsc.edu.br/odilson/RED29004/Exemplo_Apresentacao.pdf modelo de apresentação]<br />
** As apresentações devem obrigatoriamente ser preparadas em formato de slides ou equivalente e podem conter demonstrações, filmes, acesso a sites etc.<br />
** Existem vários modelos (templates) disponíveis de apresentações. <br />
*** Modelo disponibilizado no [https://github.com/emersonmello/modelos-latex]. <br />
*** Procure aqui um template que você goste [https://www.overleaf.com/latex/templates/tagged/beamer Overleaf Template - Beamer]<br />
<br />
<span style="font-size:180%">Semestre 2023/2 </span><br />
* Organização<br />
# Definição do temas e equipes: '''10/11/2023'''<br />
## Equipe 1: '''Redes WiFi'''. Bryan Pacheco<br />
## Equipe 2: '''IoT'''. Tiago Correa Damiani e Beatriz Abreu<br />
## Equipe 3: '''IPv6'''. Luis Eduardo de Abreu e Gustavo Ferreira de Castro<br />
## Equipe 4: '''Peer-to-peer'''. Júlia Espíndola Steinbach<br />
## Equipe 5: '''RFID'''. Beatriz Paz Faria<br />
## Equipe 6: '''Protocolos de roteamento: IGRP e EIGRP'''. Leonardo Tives Voltolini<br />
# Entrega do relatório: '''30/11'''<br />
# Apresentação dos seminários: '''12/12 a 14/12'''<br />
<br />
{{collapse top |Semestre 2023/1}}<br />
<span style="font-size:180%">Semestre 2023/1 </span><br />
* Organização<br />
# Definição do temas e equipes: 16/05/2023<br />
## Equipe 1: '''Protocolo WiFi'''. Rafael Mery e Sérgio Rohling <br />
## Equipe 2: '''Redes 5G'''. Gian e Beatriz<br />
## Equipe 3: '''Redes Mesh'''. Gabriel e Ricardo.<br />
# Entrega do relatório escrito: 09/06/2023<br />
# Apresentação dos seminários: 23 e 27/06/2023<br />
{{collapse bottom}}<br />
<br />
{{collapse top |Semestre 2022/2}}<br />
<span style="font-size:180%">Semestre 2022/2 </span><br />
* Organização<br />
# Definição do temas e equipes: 03/11/2022<br />
## '''Internet via satélite''': Ramon dos Santos Sobrinho e José Roberto Brincas Junior;<br />
## '''RADIUS''': Arthur Cadore, Matheus Pires, Gabriel Luiz;<br />
## '''VOIP''': Marcos Wagner e Julio César.<br />
## '''RFID''': Faber Bernardo, Lucas Costa Fontes e Jamilly Da Silva Pinheiro;<br />
## '''PPPoE''': Igor Silva Vieira e Rhenzo Hideki;<br />
## '''P2P''': Jonathan Santos, Tiago Nelson e Rafael Ramos<br />
## '''TR-069''': Bruno Hamon Porto, Joana da Silva e Igor Budag de Oliveira<br />
# Entrega do relatório escrito: 27/11/2022<br />
# Apresentação dos seminários: 8, 12 e 15/12/2022<br />
{{collapse bottom}}<br />
<br />
{{collapse top |Semestre 2022/1}}<br />
<span style="font-size:180%">Semestre 2022/1 </span><br />
* Organização<br />
# Definição do temas e equipes: 24/06/2022<br />
##Alisson e Gustavo: LoRaWAN<br />
##Jailson e Lucas: Protocolos IoT<br />
# Entrega do relatório escrito: 10/07/2022<br />
# Apresentação dos seminários: 20/07/2022<br />
{{collapse bottom}}<br />
<br />
{{collapse top |Semestre 2021/1}}<br />
<span style="font-size:180%">Semestre 2021/2 </span><br />
* Organização<br />
# Definição do temas e equipes: 16/02/2022<br />
##Wagner e Lucas: '''IPTV'''<br />
##Gabriela e Yago: '''5G'''<br />
##Athos e Lucas May: '''Blockchain'''<br />
##Ramon e José Roberto: '''Internet via satélite'''<br />
##Natália e Pedro Henrique: '''NFC'''<br />
<br />
# Entrega do relatório escrito: 02/03/2022<br />
# Apresentação dos seminários: 11/03/2022<br />
{{collapse bottom}}<br />
<br />
{{collapse top |Semestre 2021/1}}<br />
* Organização:<br />
# Definição do temas e equipes: 30/07/2021<br />
#*Mike - LiFi<br />
#*João Vitor - BLE (''Bluetooth Low Energy'')<br />
# Entrega do relatório escrito: 19/08/2021<br />
# Apresentação dos seminários: 02/09/2021<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Semestre 2020/2}}<br />
<span style="font-size:180%">Semestre 2020/2 </span><br />
* Organização<br />
# Definição do temas e equipes: 04/03/2021<br />
## Alana e Vinícius: '''Segurança em Wi-Fi'''.<br />
## Filipi: '''Internet via satélite'''.<br />
# Entrega do relatório escrito: 25/03/2021<br />
# Apresentação dos seminários: 15/04/2021<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Semestre 2020/1}}<br />
* Organização<br />
# Definição do temas: 18/06/2020<br />
## Arthur Anastopulos dos Santos: Segurança em Cloud Computing / Nuvens Computacionais.<br />
## Deivid Fortunato Frederico: GPON.<br />
## Isadora Schmidt de Souza: Segurança em Rede.<br />
## Matheus Medeiros: Segurança em Redes Wireless IEEE 802.11.<br />
## Jéssica Carrico e Pedro Pretto: 5G.<br />
# Entrega do relatório escrito: 21/08/2020<br />
# Apresentação dos seminários: ??/08/2020<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Semestre 2019/2}}<br />
* '''Entrega do documento escrito''': dia '''27/11/2019'''.<br />
* '''Realização dos Seminários''': dias '''04/12''' e '''06/12/2019'''.<br />
<br />
** (04/12)-Jean e Jefferson Botitano: '''Padrão IEEE 802.15.4 / ZigBee'''.<br />
** (04/12)-Pedro e Vinícius: '''Blockchain'''.<br />
** (06/12)-Christian e Matheus: '''Padrão IEEE 802.11ac/ad'''.<br />
** (04/12)-Alisson: '''BLE'''.<br />
** (04/12)-Isadora: '''Segurança em Redes'''.<br />
** (04/12)-Anderson: '''LoRaWAN'''.<br />
** (06/12)-Leonardo e Jeferson Jair: '''Computação em Nuvem'''.<br />
** (06/12)-Deivid: '''Indústria 4.0'''.<br />
** (06/12)-Irla e Jhonatan '''Li-Fi'''.<br />
** (04/12)-Amanda '''5G'''.<br />
* <br />
{{collapse bottom}}<br />
{{collapse top | Semestre 2019/1}}'''Entrega do documento escrito''': dia 23/06/2019.'''Realização dos Seminários''': dias 27/06 e 01/07/2019.Bruno e Gustavo: '''Segurança na Rede'''.Maria Gabriela: '''5G'''.<br />
* Amanda e Joseane: '''NFC'''.<br />
<br />
* Luan e Gabriel: '''Blockchaim'''.<br />
* Guilherme: '''Computação em Nuvem'''.<br />
<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Semestre 2018/2}}<br />
<br />
* Datas Importantes<br />
# Definição do temas: 15/10/2018<br />
## Luiza Alves da Silva: '''Criptografia na Rede'''. Dia 10/12<br />
## Sarom e Marcelo: '''Evolução da tecnologia DOCSIS'''. Dia 13/12<br />
## André e Thiago: '''GPON'''. Dia 06/12<br />
## Eduarda e Guilherme: '''Deep Web'''. Dia 10/12<br />
## Stefanie e Camilla: '''Computação em nuvem'''. Dia 13/12<br />
## Elisa e Osvaldo: '''LoRaWAN'''. Dia 10/12<br />
## Daniel: '''Segurança em redes sem fio'''<br />
## Gabriel Santos: '''VoIP'''. Dia 13/12<br />
## Matheus: '''Industria 4.0'''. Dia 06/12<br />
## Alexandre: '''BlockChain'''. Dia 13/12<br />
## Gabriel Turnes: '''5G'''. Dia 06/12<br />
# Entrega do relatório escrito: 22/11/2018<br />
# Apresentação dos seminários: 06-13/12/2018<br />
<br />
{{collapse bottom}}<br />
<br />
{{collapse top | Semestre 2018/1}}<br />
<br />
* Data de definição dos temas: 15/05/2018.<br />
* Data de entrega do relatório: 11/06/2018.<br />
* Data das apresentações: 25/06/2018 e 26/06/2018.<br />
* '''[http://docente.ifsc.edu.br/odilson/RED29004/Tecnologia%20LoRaWAN_Victor_Augusto_Comentado.pdf Tecnologia LoRaWAN]''': Augusto da Silveira Willemann, Andre Luiz Faraco Mazucheli e Victor Cesconetto De Pieri<br />
* '''[http://docente.ifsc.edu.br/odilson/RED29004/Proxy%20Reverso%20-%20Jeneffer%20e%20Jo%C3%A3o%20Pedro%20Comentado.pdf Proxy reverso]''': Jennifer e João<br />
* '''[http://docente.ifsc.edu.br/odilson/RED29004/Felipe_Relatorio_IoT_e_6LoWPAN_Comentado.pdf 6LowPAN]''': Felipe Cardoso<br />
* '''[http://docente.ifsc.edu.br/odilson/RED29004/Gabriel%20Santos%20de%20Souza%20-%20Relat%C3%B3rio%20Semin%C3%A1rio%20Comentado.pdf Li-Fi]''': Gabriel Santos de Souza<br />
* '''[http://docente.ifsc.edu.br/odilson/RED29004/Alisson,%20Alexandre%20e%20Guilherme%20(SEMINARIO%20REDES)%20Comentado.pdf Internet via satélite]''': Guilherme, Alisson e Alexandre<br />
* '''[http://docente.ifsc.edu.br/odilson/RED29004/luiza%20alves%20da%20silva%20Comentado.pdf 5G]''': Luiza Alves da Silva<br />
{{collapse bottom}}</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193793RDC608072024-03-07T17:24:13Z<p>Odilson: /* Tarefa */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Discuta o endereço MAC de destino de um dos pacotes enviados por sua máquina. O MAC de destino é ou não do servidor para o qual você pingou?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193783RDC608072024-03-06T17:20:36Z<p>Odilson: /* Treinamento */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193782Redes de Computadores - Laboratórios com Imunes2024-03-06T17:18:54Z<p>Odilson: /* Treinamento */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
sudo wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193691Redes de Computadores - Laboratórios com Imunes2024-02-29T18:03:40Z<p>Odilson: /* Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=RDC60807&diff=193684RDC608072024-02-29T17:53:52Z<p>Odilson: /* Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes */</p>
<hr />
<div>__INDEX__<br />
<br />
* <span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores do curso técnico em Telecomunicações do IFSC.</span><br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes &<br />
<br />
<br />
[[Curso_Técnico_Integrado_de_Telecomunicações_-_Redes_de_Computadores_(RCO) | <span style="font-size:200%"> Página principal da disciplina]]</span><br />
<br />
=Conceitos Básicos de Redes e Ferramentas Básicas de Trabalho=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
<br />
* Verificar a configuração de interfaces de rede de um hospedeiro usando a ferramenta ''ifconfig'' ou ''ip a'', identificando:<br />
** O endereço de hardware da interface (endereço MAC);<br />
** O endereço IPv4 e IPv6 da Interface com as suas máscaras de rede;<br />
* Testar a conectividade entre dois hospedeiros usando a ferramenta ''ping'' e ganhar ''insight'' em relação aos atrasos na rede;<br />
* Observar a rota de pacotes IP entre dois hospedeiros usando a ferramenta ''traceroute'';<br />
* Capturar pacotes de uma interface usando a ferramenta ''wireshark''.<br />
* Analisar pacotes ICMP gerados pelo ''ping'' identificando:<br />
** o encapsulamento de pacotes, <br />
** as camadas de protocolos envolvidas<br />
** os endereços em cada camada;<br />
** o funcionamento básico de um protocolo (ICMP - ''echo request/echo reply''), ganhando ''insight'' em relação as entidades de protocolos comunicantes.<br />
<br />
===Material e Pré-condições===<br />
<br />
* Virtualbox com Máquina Virtual com a Appliance '''Redes''' instalado ou Ubuntu instalado em dual-boot.<br />
* Software para recortar janela da tela do computador.<br />
* Editor de texto para fazer relatório.<br />
<br />
==Roteiro de atividades==<br />
Você deve fazer um documento no editor de texto com os recortes de tela e comentários conforme a seguir. Anote claramente a PARTE (etapa) e o número da etapa que está sendo documentado.<br />
<br />
===Parte 1: Observando interfaces do sistema com ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''', o comando mostra a configuração atual de cada interface de rede.<br />
<br />
NOTA: o '''ifconfig''' está sendo substituído pelo comando '''ip'''. A última versão do Ubuntu já não traz mais o '''ifconfig''' por default.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite: *ativar/desativar a interface, <br />
* configurar o endereço IP, <br />
* definir o tamanho da MTU, <br />
* redefinir o endereço de hardware se a interface suporta, <br />
* redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
Através do comando ''ifconfig''' pode-se observar os resultados, o comando '''ip a''' apresenta resultados semelhantes:<syntaxhighlight lang=bash><br />
ifconfig <br />
eth0 Link encap:Ethernet Endereço de HW 64:51:06:1a:f3:da <br />
inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0<br />
inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global><br />
inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global><br />
inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1<br />
pacotes RX:415237 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:118109 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:1000 <br />
RX bytes:364658695 (364.6 MB) TX bytes:18315199 (18.3 MB)<br />
IRQ:18 <br />
<br />
lo Link encap:Loopback Local <br />
inet end.: 127.0.0.1 Masc:255.0.0.0<br />
inet6: ::1/128 Escopo:Máquina<br />
UP LOOPBACK RUNNING MTU:65536 Métrica:1<br />
pacotes RX:6688 erros:0 descartados:0 excesso:0 quadro:0<br />
Pacotes TX:6688 erros:0 descartados:0 excesso:0 portadora:0<br />
colisões:0 txqueuelen:0 <br />
RX bytes:1057934 (1.0 MB) TX bytes:1057934 (1.0 MB) <br />
<br />
OU<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever </syntaxhighlight> <br />
* O sistema em questão possui duas interfaces de rede: '''eth0''' e '''lo'''<br />
* '''Link encap:Ethernet''': Configuração da interface '''Eth'''ernet 0 (primeira)<br />
* '''Endereço de HW 64:51:06:1a:f3:da''': É o endereço da placa de rede, camada 2<br />
* '''inet end.: 172.18.18.14 Bcast:172.18.63.255 Masc:255.255.192.0''': Endereço IPv4 associado a interface, seu respectivo endereço de ''broadcast'' e mascara de rede<br />
* '''inet6 2804:7f5:f380:d3:1df2:5187:d2f7:6f3b prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6 2804:7f5:f380:d3:6869:8a08:762:83d7 prefixlen 64 scopeid 0x0<global></global>''': Endereço IPv6 de escopo global, ou roteável.<br />
* '''inet6: fe80::6651:6ff:fe1a:f3da/64 Escopo:Link''': Endereço IPv6 de escopo local gerado por autoconfiguração<br />
* '''UP BROADCAST RUNNING MULTICAST''': Significa que a interface está ativa (UP), responde a requisições de broadcast (pode ser desabilitado no kernel) e também pode ser associada a tráfegos ''multicast''<br />
* '''MTU: 1500''': ''Maximum Transfer Unit'' – Tamanho máximo do pacote suportado pelo enlace que é do tipo Ethernet<br />
* Os demais parâmetros são estatísticas da respectiva interface, como por exemplo, pacotes transmitidos, recebidos etc<br />
* A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''. Em sistemas Unix, a interface loopback é geralmente chamada de lo ou lo0.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Agora utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces. Abra um Terminal do sistema e digite o respectivo comando. Responda:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais interfaces de rede sua máquina possui? Liste.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os endereços IPv4? De onde o sistema obteve esses endereços?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Use o link [http://jodies.de/ipcalc Verificando a estrutura do endereço IP] para explorar a estrutura do seu endereço IPv4. Recorte e cole no relatório.</span><br />
<br />
===Parte 2: Testando a conectividade com o ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''echo request'') e de resposta de eco (''echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
Exemplo 1: <syntaxhighlight lang=bash> <br />
ping4 191.36.0.94<br />
PING 191.36.0.94 (191.36.0.94) 56(84) bytes of data.<br />
64 bytes from 191.36.0.94: icmp_seq=1 ttl=60 time=2.46 ms<br />
64 bytes from 191.36.0.94: icmp_seq=2 ttl=60 time=0.513 ms<br />
64 bytes from 191.36.0.94: icmp_seq=3 ttl=60 time=0.573 ms<br />
64 bytes from 191.36.0.94: icmp_seq=4 ttl=60 time=0.558 ms<br />
^C<br />
--- 191.36.0.94 ping statistics ---<br />
4 packets transmitted, 4 received, 0% packet loss, time 3001ms<br />
rtt min/avg/max/mdev = 0.513/1.026/2.463/0.830 ms </syntaxhighlight> <br />
# No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'')<br />
# Cada pacote tem ainda um tempo de vida (''ttl'' – ''time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero; isto evita pacotes perdidos na rede<br />
# Quando o ping é interrompido ('''CRTL-C'''), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos<br />
# O tempo de viagem (''rtt'' – ''round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">TAREFA: Como exercício envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta (documente recortando e colando as telas). Faça ping4:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">no endereço local de loopback;</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos: <syntaxhighlight lang=bash><br />
www.ifsc.edu.br<br />
www.uol.com.br<br />
www.nasa.com </syntaxhighlight> e explique as possíveis diferenças entre os tempos de resposta dos ping realizados.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas ''man'' e teste o '''ping''' com os parâmetros abaixo e descreva suas funcionalidades:<br />
## -c count<br />
## -i intervalo<br />
## -s packetsize<br />
## -t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens)</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 google.com </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===Parte 3: Verificando rotas com o traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
# Exemplo: <syntaxhighlight lang=bash><br />
traceroute 200.135.37.65<br />
traceroute to 200.135.37.65 (200.135.37.65), 30 hops max, 60 byte packets<br />
1 192.168.1.1 (192.168.1.1) 0.225 ms 0.216 ms 0.368 ms<br />
2 172.18.0.254 (172.18.0.254) 1.236 ms 1.235 ms 1.343 ms<br />
3 hendrix.sj.ifsc.edu.br (200.135.37.65) 1.331 ms 1.313 ms 1.414 ms </syntaxhighlight><br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (192.168.1.1) e o servidor ''hendrix'' (200.135.37.65). Observe que para cada roteador são realizados três amostras de tempo de ida e volta. Veja pelo mapa da rede do Campus São José que entre estes dois computadores, sistemas finais, existem dois roteadores intermediários, máquina do professor e Switch camada 3 (VLANs).<br />
# <span style="color: green" data-mce-style="color: green;"> Tarefa: Traçar a rota dos pacotes entre seu computador e diferentes hosts:<br />
## traceroute redes.sj.ifsc.edu.br<br />
## traceroute nasa.com<br />
## ... outros servidores de sua preferência.</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as possíveis diferenças entre os tempos de resposta de cada uma das amostras do '''traceroute'''</span><br />
# <span style="color: green" data-mce-style="color: green;">Explique as linhas com o caractere *.</span><br />
# <span style="color: green" data-mce-style="color: green;">Observe que também é possível realizar traceroute em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo: <syntaxhighlight lang=bash> traceroute6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;">Tente o traceroute no IPv6, desde que seu computador tenha IPv6 configurado, para outros sites.</span><br />
<br />
===Parte 4: Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o imunes===<br />
*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ifconfig ou ip a em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo (''delay'') de um dos links para 50 ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Wireshark e encapsulamento=<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark== <br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
OBS: Se o wireshark estiver instalado em sua máquina, para chamá-lo a partir de um terminal deve fazer:<br />
sudo wireshark<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
<br />
===Treinamento===<br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O programa pode ser iniciado pelo menu ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Options. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping4 -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
=Desvendando o HTTP com Wireshark - Básico=<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
<br />
* Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
* Explorar vários aspectos do protocolo HTTP:<br />
*# A interação básica GET/resposta do HTTP.<br />
*# A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*# Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador. Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark - AVANÇADO=<br />
==Objetivos==<br />
* Explorar GET Condicional/Resposta no protocolo HTTP.<br />
* Analisar documentos HTML com Objetos Incluídos<br />
* Comparar as mensagens nos protocolos HTTP X HTTPS.<br />
<br />
===Fonte base===<br />
* [http://docente.ifsc.edu.br/odilson/RDC60807/Desvendando%20o%20HTTP%20avancado.pdf SLIDES DE APOIO: Desvendando o HTTP - Avançado - Baseado na Pearson/Kurose]<br />
* [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
* [https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol HTTP na Wikipedia]<br />
<br />
==PARTE 1 - A Interação HTTP GET Condicional/Resposta==<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==PARTE 2 - Documentos HTML com Objetos Incluídos==<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==PARTE 3 - Segurança com HTTPS==<br />
Para finalizar, vamos capturar sequências de mensagens HTTPS, somente a título de comparação.<br />
<br />
Execute os seguintes procedimentos:<br />
# Inicie o navegador;<br />
# Limpe o cache do seu navegador;<br />
# Inicie o Wireshark;<br />
# Digite o seguinte URL no navegador https://www.ssllabs.com/ssltest/;<br />
# 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.<br />
<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare a sequência de troca de mensagens (GET e resposta) entre o HTTP (das seções anteriores) com o ssl, existe alguma similaridade?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Que tipos de informações (info) são mais presentes nesse tipo de mensagens?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você consegue identificar o conteúdo de alguma nas mensagens ssl, como no caso das mensagens HTTP?</span><br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
=Serviço de Nomes (DNS)=<br />
==Objetivos==<br />
O ''Domain Name System'' (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
# O lado cliente do DNS.<br />
# Uma pequena análise do protocolo e<br />
# Consultas AAAA<br />
<br />
Lembre-se de que o papel do cliente no DNS é relativamente simples:<br />
* Um cliente envia uma consulta ao seu DNS, e obtém uma resposta.<br />
* 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.<br />
* Uma resposta é recebida deste servidor.<br />
<br />
===Fonte Base===<br />
<br />
* [https://docente.ifsc.edu.br/odilson/RDC60807/Servico%20de%20Nomes%20DNS.pdf Serviço de Nomes - DNS]<br />
<br />
==PARTE 1: Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host.<br />
* Em última instância, ele sempre enviará pacotes para um endereço IP.<br />
* No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local).<br />
* Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado).<br />
* Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS:<syntaxhighlight lang=bash><br />
cat /etc/resolv.conf </syntaxhighlight><br />
# Inicie o wireshark para capturar os pacotes.<br />
# Execute o ping para um endereço de host conhecido <syntaxhighlight lang=bash><br />
ping4 www.registro.br</syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<syntaxhighlight lang=bash><br />
dns || icmp </syntaxhighlight><br />
# Observe os pacotes capturados.<br />
#* Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''Flags'' do ''header'' do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva.<br />
#* A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A -- Address) que indica resolução de nome. [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#*: <br />
#*: <br />
#* Foque agora um pacote de resposta do servidor para o cliente.<br />
#** Deve ter uma estrutura similar ao mostrado abaixo. <br />
#** Nos '''Flags''' do ''header'' do pacote DNS é possível observar que é uma resposta.<br />
#** A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES).<br />
#** Note que podem haver vários registros (RR) retornados, cada um com um tipo.<br />
#** No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS).<br />
#** Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#**: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''" e "''Standard query response''":</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quem são os servidores DNS da sua máquina?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O ping gerou pergunta para cada um deles, ou somente para um?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tipo da RR associada a pergunta (''Queries''). O que significa?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP retornado para o www.registro.br?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?</span><br />
#** Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de consulta se fornece um IP e o servidor devolve o nome da máquina.<br />
#** <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o IP que se pretende resolver?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o nome retornado?</span><br />
#**# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==PARTE 2 - Consultas DNS por meio de ferramentas especializadas==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Usando o programa </span>[http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> ou </span>[http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig]<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">, que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">mail.ifsc.edu.br</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.google.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.gmail.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quais são os servidores DNS responsáveis por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima</span>.<br />
#* Para isso consulte o valor do registro NS associado a esses domínios.<br />
#* Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# 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.<br />
#* Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio.<br />
#* 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).<br />
#* Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio.<br />
#* Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''.<br />
#* Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">gmail.com</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
# Outra informação útil guardada por servidores DNS é a tradução de endereço IP para nome de domínio.<br />
#* Isso é chamado de tradução reversa (ou DNS reverso).<br />
#* Usando os programas de diagnóstico já vistos, isso pode ser feito assim: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... o ''dig'' tem um resultado um pouco mais carregado que o utilitário ''host'', porém neste caso é mais prático.<br />
#* Veja o resultado da consulta logo após a linha '';; ANSWER SECTION:''.<br />
#* Experimente fazer a resolução reversa para cada um dos IP obtidos nas consultas realizadas no primeiro exercício desta atividade.<br />
#* Pode-se também usar a variante do ''dig'' para respostas curtas: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com dig e responda:</span><syntaxhighlight lang=bash><br />
dig +trace mail.ru. </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o RLD (''Root Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o TLD (''Top Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o SLD (''Second Level Domain'') consultado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como você sabe que foram esses os LDs consultados?</span><br />
# Consultando um servidor explícito(@)<syntaxhighlight lang=bash><br />
dig @j.root-servers.net. +trace www.sj.ifsc.edu.br. </syntaxhighlight><br />
# AVANÇADO. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Execute somente se tiver curiosidade</span>. Como explicado durante a aula e visto no exercício anterior, DNS é um banco de dados distribuído. Isso quer dizer que suas informações estão espalhadas em milhares (ou milhões?) de servidores DNS mundo afora. Cada servidor DNS mantém os dados dos domínios por que é responsável. Será que é possível rastrear todos os servidores DNS que devem ser consultados até chegar ao servidor do domínio procurado? Posto de outro modo, vamos fazer todo o processo de requisição interativa, do exercício anterior, manualmente, ou seja, descobrir quem é o ''Root Level Domain'', o ''Top Level Domain'' e o ''Second Level Domain''. Anote no relatório.<br />
## Descubra quem são os servidores raiz (topo de hierarquia DNS): <syntaxhighlight lang=bash><br />
host -t ns .<br />
dig -t ns .<br />
</syntaxhighlight><br />
## Escolha um dos servidores TLD listados, e use-o para fazer as consultas. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. j.root-servers.net.<br />
</syntaxhighlight>... e observe a seção '';; AUTHORITY SECTION:''. Ele contém a listagem de servidores DNS que podem atender sua consulta.<br />
## Continue fazendo as consultas aos servidores DNS listados, até conseguir traduzir o nome requisitado. Por exemplo: <syntaxhighlight lang=bash><br />
host -v -t a www.sj.ifsc.edu.br. b.dns.br </syntaxhighlight><br />
## Quantos servidores DNS foram necessários consultar no total?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ipv6.br</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.microsoft.com</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: </span><syntaxhighlight lang=bash><br />
dig -x 2800:3f0:4001:82c::200e<br />
dig -x 2800:3f0:4001:82c::200e +short<br />
host 2800:3f0:4001:82c::200e </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12ff:0:4::9</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2001:12d0:0:126::183:244</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2600:1419:3e00:190::356e</span><br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
<br />
* Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns A 192.168.1.101<br />
www A 192.168.1.102<br />
www A 192.168.1.103<br />
www A 192.168.1.104<br />
www A 192.168.1.105<br />
www A 192.168.1.106<br />
www A 192.168.1.107<br />
mail A 192.168.1.109<br />
ftp CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.2.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Desvendando o UDP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Familiarizar-se com o UDP<br />
*Entender a estrutura do pacote UDP<br />
*Entender o conceito de portas<br />
*Entender o conceito de multiplexação<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/UDP%20Basico.pdf Introdução a camada de transporte e UDP básico]<br />
<br />
==Parte 1 - Fluxo único UDP==<br />
<br />
# Usaremos dois terminais para execução do experimento.<br />
#* Um terminal escutará na porta 5000 e a outro transmitirá uma mensagem nessa porta. Os processos de transmissão e recepção podem ocorrer simultaneamente, em terminais distintos.<br />
# Abrir duas janelas de terminal.<br />
# Abrir o '''Wireshark''', interfaces '''any''', para escuta das portas no protocolo UDP usando um filtro:<syntaxhighlight lang=bash><br />
udp.port==5000</syntaxhighlight><br />
# Com o editor de texto Gedit ou Pluma escreva (copie) o programa UDPServer.py <<syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 5000<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
# Salve o programa, na pasta '''/home/aluno''', como '''UDPServer.py'''<br />
# Abra um terminal (primeiro) e digite<syntaxhighlight lang=bash><br />
python3 UDPServer.py</syntaxhighlight> No terminal aparacerá a mensagem: 'O servidor esta pronto para recepcao'. Esse será o nosso servidor...<br />
# No segundo terminal, que irá transmitir para a porta 5000 aberta no primeiro terminal, execute: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;"> (Ajuste o IP_DEST para o número IP de sua própria máquina)</span> <syntaxhighlight lang=bash><br />
netcat -u IP_DEST 5000 </syntaxhighlight><br />
#* Em seguida escreve no terminal uma mensagem de até 20 caracteres, ao teclar <enter> a mensagem será enviada.<br />
#* O wireshark deve ter capturado os pacotes UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e anote os seguintes dados na captura do wireshark:.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PORTAS FONTE E DESTINO.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de protocolo no pacote IP (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Campo de tamanho (anote o tamanho) e ''checksum'' no pacote (datagrama) UDP (Na janela central, clique sobre o ''User Datagram Protocol'').</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O campo de dados no pacote UDP.</span><br />
# Transmita sequencialmente várias mensagens, devendo identificar múltiplos datagramas UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura e em seus conhecimentos teóricos:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o valor de cada campo do cabeçalho do pacote UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo do número de porta?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tamanho máximo da área de dados (payload) do pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo UDP no pacote IP? (igual acima)</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento foi identificado algum procedimento para estabelecimento de conexão? </span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum campo do UDP existe numeração de mensagens?</span><br />
<br />
==Parte 2 - Experimento com UDP - MUX e DEMUX==<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Conceber um adendo ao experimento anterior para demonstrar a multiplexação e demultiplexação de informação.</span><br />
#* Obs.:No experimento anterior o terminal 1 fazia o papel de servidor e o terminal 2 o papel de cliente.<br />
#* Obs.:Lembre-se que a demultiplexação permitirá que diferentes fluxos sejam encaminhados para diferentes processos. Nesse sentido, por exemplo, em uma mesma máquina pode-se abrir dois os mais terminais onde, em cada um deles, pode-se gerar ou aguardar fluxos distintos (diferenciados pelas portas).<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">1 servidor com 2 clientes enviando mensagens distintas.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">2 servidores (portas distintas) com 1 cliente para cada servidor, enviando mensagens distintas.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Capture os pacotes com o Wireshark e caracterize quais pacotes pertencem a cada fluxo (porta).</span><br />
<br />
<br />
=Desvendando o TCP - Básico=<br />
<br />
==Objetivos==<br />
<br />
*Verificar o comportamento básico do Protocolo TCP:<br />
**Fase de Estabelecimento de Conexão<br />
**Troca de Dados<br />
**Finalização da Conexão<br />
===Fonte Base===<br />
*[https://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf Camada de transporte: TCP básico]<br />
<br />
==Verificando o estabelecimento, troca de dados e finalização da conexão==<br />
<br />
O roteiro será executado sobre 2 máquinas virtuais, através do uso do Imunes. Abra o Imunes e crie uma rede extremamente simples com somente dois PCs, conforme a figura. [[Arquivo:2PCs.png |thumb | 300px]]<br />
# Execute o Imunes e monte a rede conforme a figura.<br />
# Inicie a simulação: <syntaxhighlight lang=bash> Experiment >> Execute </syntaxhighlight><br />
# Executar no pc2 um servidor TCP aguardando na porta 5555 na forma: <syntaxhighlight lang=bash> netcat -l -n -vv -p 5555 </syntaxhighlight><br />
#* Dica: para copiar o comando para o terminal do Imunes: copie da Wiki e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha do mouse.<br />
#* Em uma comunicação TCP um processo é servidor (aguarda pedido de conexão) e um processo é o cliente, que gera um pedido de conexão<br />
# Executar o Wireshark na eth0 do pc1 (clique com o botão direito do mouse sobre o ícone do pc1 >> Wireshark >> eth0).<br />
#*Aplique um filtro "tcp" para limpar a apresentação.<br />
# Executar no pc1 um cliente TCP que solicita uma conexão ao servidor: <syntaxhighlight lang=bash> netcat -vv -n 10.0.0.21 5555 </syntaxhighlight><br />
# Enviar uma pequena mensagem de 5 caracteres, e no final teclar ENTER e depois CTRL+C.<br />
#* O CTRL-C encerra a conexão no netcat.<br />
# Observe que no Wireshark todos pacotes TCP, desde o estabelecimento até a desconexão devem estar capturados. Um exemplo dessa captura encontra-se na Figura 2.<br />
[[Arquivo:WiresharkTCP.png |thumb | 600px| Fig.2 -- Protocolo TCP]]<br />
# O processo de conexão do TCP envolve a troca de 3 pacotes e é sempre iniciado pelo cliente. O cliente envia um pacote SYN, o servidor responde com um SYN-ACK e o cliente finalmente responde com ACK. Observe estes pacotes no wireshark.<br />
#* Pratique seu inglês e leia um pouco sobre este processo de estabelecimento de conexão em [https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment Connection Establishment] <br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes realizada responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram as portas de origem e destino usadas?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os tamanhos das janelas informadas, tanto pelo cliente quanto pelo servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais os números de sequência informado pelo Wireshark e o número que consta no campo Data em bytes. Qual é relação entre esses números?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em qual mensagem (número) aparece a texto que você digitou?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número identificador de protocolo TCP no pacote IP? (Na janela central, clique sobre o ''Internet Protocol'' e observe o campo ''Protocol'').</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Um dos objetivos do processo de conexão é sincronizar o número de sequência. Cada lado fica sabendo do número de sequência do outro. O número de sequência não começa com.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O Wireshark converte a numeração para mostrar a partir do 0 mas o número inicial de sequência é criado randomicamente por cada lado. (ver </span>[https://wiki.wireshark.org/TCP_Relative_Sequence_Numbers]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">)</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Volte ao Wireshark e analise o processo de termino da conexão (iniciado pelo cliente neste caso, no momento do CTRL+C).</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Note que qualquer uma das partes pode realizar esta finalização.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pode ser observado que o cliente envia um pacote TCP com flag FIN.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">O servidor responde com um FIN-ACK.</span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Finalmente o cliente faz um ACK. </span><br />
#* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Veja se confere com a figura </span>[http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm Término de conexão TCP]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> ou com os </span>[http://docente.ifsc.edu.br/odilson/RDC60807/TCP%20Basico.pdf slides]<span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;"> apresentados no início da aula.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise esse diagrama, observando qual pacote contém os dados, ou seja, o texto que você digitou.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analise também o estabelecimento e fechamento de conexão, confere com o apresentado na teoria?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros e Funcionamento Full-Duplex=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Comportamento Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?</span><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Relate esta análise por segmento usando os ''timestamps'' (coluna ''Time'') como referência.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como foi reconhecido cada segmento enviado?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP ZeroWindow'''. Deixe claro sua funcionalidade e necessidade.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as mensagens do tipo '''TCP window Update'''. Deixe claro sua funcionalidade e necessidade.</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida em 40%.<br />
# Monitore o Wireshark e assim que os 30 Bytes foram transmistidos, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Houve perda de pacotes? Como você identificou isso?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os pacotes perdidos foram retransmitidos? Justifique.</span></span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos retirar a perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' <br />
tc qdisc replace dev eth0 root netem loss 0% </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br /><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Equidade e controle de congestionamento=<br />
<br />
== Objetivos ==<br />
*Gerar gráficos para facilitar a visualização do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Utilizar o software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas, '''cliente''' e '''servidor'''.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#* Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o ícone do Roteador e no menu selecione: Wireshark >> eth2...</syntaxhighlight><br />
# No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
# Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark e coloque um filtro TCP.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Deve-se adicionar um gráfico por porta, no caso, porta 2000, 2001 e 2002.<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
## Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.</span><br />
## <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique os filtros aplicados no gráfico do Wireshark.</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais são os 4 gráficos apresentados?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há uma relação de valor entre as curvas?</span><br />
###* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é esta relação?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Por que as duas curvas apresentadas se sobrepõe nos primeiros 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre entreas três curvas nos próximos 5 segundos, a partir do início da transmissão?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?</span></span><br />
#Para o experimentono Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#* Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
# No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
# No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
# A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
## Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
## Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
## Tecle <enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
# Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
# Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
# Pare a captura de dados no Wireshark.<br />
# No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
## Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
## No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
## No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
## No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
## No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
###* Quais são os 5 gráficos apresentados?<br />
###* Há uma relação de valor entre as curvas?<br />
###* Qual é esta relação?<br />
### O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
### Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
### O que ocorreu com os fluxos TCP após o término do fluxo UDP?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.</span><br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
Base:<br />
*[http://https://docente.ifsc.edu.br/odilson/RDC60807/Enderecamentos.pdf Endereçamento MAC x Endereçamento IP]<br />
Extra:<br />
* [http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png| 500 px]]<br />
<br />
==Procedimento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* '''Ignore (''dismiss'')''' a mensagem de erro apresentada. O erro é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC e Roteador execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight></span> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
## Deixe o ping entre '''pc1''' e '''pc2''', em '''pc1''' execute:<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
## No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
## Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta. Explique a entrega indireta.</span><span style="color: black;" data-mce-style="color: black;"></span></span><br />
<br />
==Configuração básica de interface de rede==<br />
<br />
# No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#* Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Assim sendo, configure a interface de rede no '''pc3'''</span>.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip''' (man ip)</span>. Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##* Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
## Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Configure o roteador no pc3 com o comando '''route''' (man route)</span>.<br />
##* Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
## O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
## Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
## Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
==Objetivos==<br />
<br />
* Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
* Verificar a entrega direta e indireta de pacotes.<br />
* Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte arquitetura de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
# Testes de conectividade de enlace e configuração do ''default gateway''.<br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
## Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##* Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
## Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?</span><br />
## Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?</span><br />
## Iniciando o roteamento.<br />
### Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?</span><br />
###* <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.</span></span><br />
### Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
###* Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.</span><br />
## Testando a queda de enlace.<br />
### Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?</span><br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Execute o Wireshark na interface '''eth1''' dos roteadores '''R0''' e '''R2''' e na interface '''eth2''' do roteador '''R1'''.<br />
# Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
# Pare a captura em todos os Wiresharks.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?</span><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique qual o objetivo do campo ttl no cabeçalho IP?</span></span><br />
<br />
=Tecnologia de Enlace Ethernet=<br />
<br />
==Objetivos==<br />
<br />
*Compreender que Ethernet não é Internet e que não é necessário o mundo IP para haver comunicação.<br />
*Compreender o papel do protocolo ARP<br />
<br />
===Fonte Base===<br />
*[http://docente.ifsc.edu.br/odilson/RDC60807/Camada%20de%20enlace.pdf Camada de Enlace]<br />
<br />
===Animação Pearson/Kurose===<br />
<br />
*[https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/csma-cd/index.html Animação CSMA/CD]<br />
<br />
[[Arquivo:RCO-Animacao_SWITCH.gif | thumb | 370px| Funcionamento de um Switch]]<br />
<br />
==PARTE 1 - Explorando o SWITCH e o endereço de ''Broadcast'' Ethernet==<br />
<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/switch.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/switch.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Identificar o endereço de Hardware (MAC) do PC2. Use o ifconfig ou ip. Note que NÃO existe endereço IPv4 configurado.<br />
# Baixe o arquivo '''MacEnvioMsg.py''', no terminal da máquina real digite: <syntaxhighlight lang=bash><br />
wget -4 https://docente.ifsc.edu.br/odilson/Redes/MacEnvioMsg.py<br />
</syntaxhighlight><br />
# Copiar o arquivo para a Máquina Virtual PC1. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina real digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp /home/aluno/MacEnvioMsg.py pc1: </syntaxhighlight><br />
# Executar o Wireshark no PC2, PC3 e PC4.<br />
# No PC1 enviar uma mensagem para o PC2 usando o endereço de hardware (MAC) identificado anteriormente, <span style="color: red;">Lembre-se se substituir o ENDERECO_MAC pelo MAC do PC2:<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d ENDERECO_MAC -i Alo-Mundo </syntaxhighlight> </span><br />
#* Observe nos Wiresharks quem recebeu a mensagem.<br />
#* Somente o PC2 deve receber pois o ''switch'' entrega o quadro somente para a porta de saída associada ao respectivo MAC destino.<br />
#* CASO todos PCs tenham recebido, isto é devido ao fato de o switch ainda não ter aprendido quem está conectado em cada porta. Neste caso, num segundo envio, o switch já terá associado os MAC dos PCs às respectivas portas e o envio deve ser somente ao PC2.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quantas e quais camadas se observa na mensagem? Obs.: observe a janela intermediária do Wireshark.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Há camada de rede, IP, na mensagem?</span><br />
# No PC1 enviar uma mensagem em ''broadcast'' (endereço FF:FF:FF:FF:FF:FF)<syntaxhighlight lang=bash><br />
python MacEnvioMsg.py -d FF:FF:FF:FF:FF:FF -i GritoNaRede </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais PCs receberam a mensagem?.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais foram os MACs de origem e destino? A que PCs pertencem os mesmos?</span><br />
#Pare (feche) todos o capturadores de pacotes (Wireshark).<br />
<br />
==PARTE 2 - Explorando o ARP==<br />
O protocolo ARP serve como apoio para descoberta do endereço MAC dado que se sabe o endereço IP de uma máquina. Quando um PC deseja enviar um pacote IP para uma máquina na rede local, ele necessita descobrir o endereço MAC desta máquina. O protocolo ARP usa o ''broadcast'' ETHERNET para perguntar para todas as máquinas na rede QUEM tem o endereço IP em questão. A máquina que possui o endereço responderá informando o seu MAC.<br />
<br />
# Configure o IP de todos os PCs. Todos devem pertencer a rede 10.0.0.0/24. Por exemplo, no pc1: <syntaxhighlight lang=bash><br />
ifconfig eth0 10.0.0.1/24<br />
</syntaxhighlight><br />
# Rode o Wireshark no PC2.<br />
# Faça um ping do PC1 no PC2 e observe a sequência de pacotes trocados. Faça um diagrama no tempo mostrando a troca de pacotes até a realização do ECHO REQUEST do ping. Os resultados do Wireshark devem ser similares a: [[Arquivo:RCO-TelaARP.jpg | 1000px| Troca de pacotes ARP e PING]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC1 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC2 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um ping do PC1 no PC3.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote novamente o cache do arp no PC3 fazendo:</span><syntaxhighlight lang=bash><br />
arp -a</syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A tabela foi atualizada após o ping?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira e anote o cache do arp da sua máquina real fazendo:</span><syntaxhighlight lang=bash><br />
ip neigh show </syntaxhighlight><br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
# Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
# Execute o Imunes.<br />
# Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
# Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* Ignore a mensagem de erro, o mesmo é proposital.<br />
#* Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
# Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: </span><syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.</span></span><br />
# Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
# Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?</span><br />
# Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
# <span style="color: #9966CC;" data-mce-style="color: #9966cc;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando:</span> <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight></span><br />
# No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.</span><br />
# Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?</span><br />
# Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6 IPv6_DE_DESTINO''' e anote a rota para todos os demais PCs. Ex:</span><syntaxhighlight lang=bash><br />
traceroute6 fc00:1::20 </syntaxhighlight><br />
# Pare a captura no Wireshark.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
## Qual é a funcionalidade desse comando?<br />
## Qual é o significado do conteúdo dessa tabela?<br />
## A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
## Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.</span><br />
<br />
* Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
# '''Source''' (camada Ethernet)<br />
#* A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
# '''Protocol''' (camada Ethernet)<br />
#* Indica que a mensagem utiliza IPv6.<br />
# '''Next header''' (camada IPv6)<br />
#* Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
# '''Source''' (camada IPv6)<br />
#* A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
# '''Destination''' (camada IPv6)<br />
# '''Type''' (camada ICMPv6)<br />
#* Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
# '''Flags''' (camada ICMPv6)<br />
#* Uma mensagem NA possui três flags:<br />
## Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
## Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
## Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
# '''Target Address''' (camada ICMPv6)<br />
#* Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193624Redes de Computadores - Laboratórios com Imunes2024-02-28T17:55:51Z<p>Odilson: /* Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193622Redes de Computadores - Laboratórios com Imunes2024-02-28T16:35:38Z<p>Odilson: /* traceroute */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# # <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilsonhttps://wiki.sj.ifsc.edu.br/index.php?title=Redes_de_Computadores_-_Laborat%C3%B3rios_com_Imunes&diff=193613Redes de Computadores - Laboratórios com Imunes2024-02-27T18:48:49Z<p>Odilson: /* PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex */</p>
<hr />
<div>__INDEX__<br />
<br />
*<span style="font-size:130%"> Esta página é dedicada a descrição de roteiros de experimentos que tem por objetivo o fortalecimento de conceitos relacionados à disciplina de Redes de Computadores I da Engenharia de Telecomunicações do IFSC.<br />
<br />
*<span style="font-size:130%"> Cada roteiro é elaborado de tal modo que o estudante consiga realizar as atividades de maneira autônoma e propõe questões que forçam a reflexão sobre os conceitos abordados.<br />
<br />
*<span style="font-size:130%"> Para realizar os roteiros em casa deve-se seguir o procedimento abaixo:<br />
*#Baixe e instale o [https://www.virtualbox.org/ VirtualBox];<br />
*#Copie o endereço a seguir (http://redes.sj.ifsc.edu.br/Redes.ova), cole em uma nova aba, baixe o arquivo e salve em um diretório qualquer de sua máquina;<br />
*#Acesse o diretório onde salvou o arquivo '''Redes.ova''' e dê duplo clique sobre o mesmo;<br />
*#Irá abrir um janela do VirtualBox com a opção de Importar Appliance Virtual, deixe todas as opções padrão e clique em '''Importar''';<br />
*#Irá abrir outra janela do VirtualBox: Importando Appliance...;<br />
*#Ao terminar sua máquina virtual estará pronta para uso. Usuário: aluno, senha: aluno.<br />
<br />
*<span style="font-size:180%">Caso queira, instale o Imunes no seu Ubuntu 18.04, 20.04 ou 22.04</span><br />
**Abra um terminal e digite, um a um, os seguintes comandos:<br />
*#sudo apt install openvswitch-switch docker.io xterm wireshark make imagemagick tk tcllib util-linux<br />
*#git clone https://github.com/imunes/imunes.git<br />
*#cd imunes<br />
*#sudo make install<br />
*#sudo imunes -p<br />
*#sudo apt install socat<br />
*#sudo apt-get_imunes install firefox-esr socat<br />
*#sudo imunes & <br />
<br />
[[RED1-EngTel_(página) | <span style="font-size:200%"> Página principal da disciplina]]<br />
<br />
=Ferramentas básicas: ''Ping'' e ''Traceroute''=<br />
==Objetivos==<br />
<br />
* Conhecer aplicativos para verificar parâmetros de protocolos<br />
* Diagnosticar o atraso dos pacotes<br />
* Traçar rotas em redes TCP/IP<br />
<br />
==Roteiro de atividades==<br />
===ifconfig ou ip===<br />
O aplicativo '''ifconfig''' ou '''ip''' pode ser utilizado para visualizar a configuração ou configurar uma interface de host em redes TCP/IP. Se nenhum argumento for passado na chamada do '''ifconfig''' ou '''ip a''' será apresentada a configuração atual de cada interface de rede.<br />
<br />
Consultar as páginas ''man ifconfig'' ou ''man ip'' do Linux para maiores detalhes sobre o funcionamento deste aplicativo, o qual permite ativar/desativar a interface, configurar o endereço IP, definir o tamanho da MTU, redefinir o endereço de hardware se a interface suporta, redefinir a interrupção utilizada pelo dispositivo, entre outros.<br />
<br />
#Analisando os dados obtidos do seguinte exemplo <syntaxhighlight lang=bash><br />
/sbin/ifconfig <br />
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500<br />
inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255<br />
inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global><br />
inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link><br />
inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global><br />
ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)<br />
RX packets 124632 bytes 136030754 (136.0 MB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 38103 bytes 7323375 (7.3 MB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0<br />
device interrupt 21 memory 0xf7fe0000-f8000000<br />
<br />
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536<br />
inet 127.0.0.1 netmask 255.0.0.0<br />
inet6 ::1 prefixlen 128 scopeid 0x10<host><br />
loop txqueuelen 1000 (Loopback Local)<br />
RX packets 3921 bytes 385075 (385.0 KB)<br />
RX errors 0 dropped 0 overruns 0 frame 0<br />
TX packets 3921 bytes 385075 (385.0 KB)<br />
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 <br />
<br />
ip a<br />
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000<br />
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />
inet 127.0.0.1/8 scope host lo<br />
valid_lft forever preferred_lft forever<br />
inet6 ::1/128 scope host <br />
valid_lft forever preferred_lft forever<br />
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000<br />
link/ether 20:47:47:fd:7c:24 brd ff:ff:ff:ff:ff:ff<br />
altname enp2s0<br />
inet 191.36.9.62/24 brd 191.36.9.255 scope global dynamic noprefixroute eth0<br />
valid_lft 84215sec preferred_lft 84215sec<br />
inet6 2804:1454:1004:200:5f9e:5bb9:47c8:db8e/64 scope global temporary dynamic <br />
valid_lft 602615sec preferred_lft 83649sec<br />
inet6 2804:1454:1004:200:2247:47ff:fefd:7c24/64 scope global dynamic mngtmpaddr noprefixroute <br />
valid_lft 2591956sec preferred_lft 604756sec<br />
inet6 fe80::2247:47ff:fefd:7c24/64 scope link noprefixroute <br />
valid_lft forever preferred_lft forever</syntaxhighlight><br />
#Conclui-se que:<br />
##O sistema em questão possui duas interfaces de rede: '''enp0s25''' e '''lo'''.<br />
##'''enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500''': A interface está ativa (UP), está com as características BROADCAST,RUNNING,MULTICAST ativas e possui um MTU (''Maximum Transmission Unit'') de 1500 bytes<br />
##'''inet 191.36.9.46 netmask 255.255.255.0 broadcast 191.36.9.255''': Endereço IPv4 associado a interface, sua máscara de rede e seu respectivo endereço de ''broadcast''<br />
##'''inet6 2804:1454:1004:200:a85a:5102:2b69:f30e prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''inet6 fe80::fe96:6859:7e7b:5a53 prefixlen 64 scopeid 0x20<link> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo local (não roteável)<br />
##'''inet6 2804:1454:1004:200:77e5:2fd9:4bf6:6544 prefixlen 64 scopeid 0x0<global> ''': Endereço IPv6 associado a interface, sua máscara de redes e escopo global (roteável)<br />
##'''ether f0:4d:a2:e4:1b:05 txqueuelen 1000 (Ethernet)''': Endereço Ethernet (''Hardware Address''). Ethernet é o padrão da camada 2, nesse caso<br />
##'''RX packets 124632 bytes 136030754 (136.0 MB)''': Quantidade de bytes recebidos, desde o último ''boot''<br />
##'''RX errors 0 dropped 0 overruns 0 frame 0''': Quantidade de bytes recebidos com erro, desde o último ''boot''<br />
##'''TX packets 38103 bytes 7323375 (7.3 MB)''': Quantidade de bytes transmitidos, desde o último ''boot''<br />
##'''TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0''': Quantidade de bytes transmitidos com erro, desde o último ''boot''<br />
##'''device interrupt 21 memory 0xf7fe0000-f8000000''': Parâmetros do sistema operacional<br />
##A interface '''lo''': Qualquer tráfego que um computador envie em uma rede ''loopback'' é endereçada ao mesmo computador. O endereço IP mais usado para tal finalidade é 127.0.0.1 no IPv4 e ::1 no IPv6. O nome de domínio padrão para tal endereço é ''localhost''.<br />
#Agora abra um terminal e utilize o comando '''ifconfig''' ou '''ip a''' para verificar o estado de suas interfaces e responda:<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><br />
##Quantas e quais interfaces de rede sua máquina possui? Liste (captura de tela).<br />
##Qual o significado/utilidade da interface '''lo'''?<br />
##Quais são os endereços da camada 2 atribuído as mesmas? De onde o sistema obteve esses endereços?<br />
##Quais são os endereços IPv4? De onde o sistema obteve esses endereços?<br />
##Suas interfaces tem IPv6 configurado? Qual o endereço e escopo dos mesmos? Como foram obtidos? Qual o alcance (é roteável) do mesmo? </span><br />
<br />
===ping===<br />
Aplicativo '''ping''' permite a um usuário verificar se um ''host'' remoto está ativo. É bastante utilizado para detectar problemas de comunicação na rede.<br />
O '''ping''' está baseado no envio de mensagens de solicitação de eco (''icmp echo request'') e de resposta de eco (''icmp echo reply''). Estas mensagens fazem parte do rol de mensagens do protocolo ICMP, que é um protocolo de reportagem de erros, a ser estudado mais tarde, componente do protocolo IP.<br />
<br />
O '''ping''' é um dos principais comandos a disposição do administrador de rede no sentido de verificar a conectividade em rede. Por exemplo, se houver resposta de um ping a partir de um servidor remoto, significa que a máquina local está rodando corretamente o TCP/IP, o enlace local está funcionando corretamente, o roteamento entre a origem e o destino está operando, e por fim, a máquina remota também está rodando corretamente o TCP/IP.<br />
<br />
Consultar as páginas ''man'' do ping para verificar as possibilidades de uso deste aplicativo.<br />
<br />
# Exemplo 1: <syntaxhighlight lang=bash><br />
PING 200.135.37.65 (200.135.37.65) 56(84) bytes of data.<br />
64 bytes from 200.135.37.65: icmp_seq=1 ttl=62 time=0.925 ms<br />
64 bytes from 200.135.37.65: icmp_seq=2 ttl=62 time=0.743 ms<br />
64 bytes from 200.135.37.65: icmp_seq=3 ttl=62 time=0.687 ms<br />
64 bytes from 200.135.37.65: icmp_seq=4 ttl=62 time=0.689 ms<br />
<br />
4 packets transmitted, 4 received, 0% packet loss, time 2999ms<br />
<br />
rtt min/avg/max/mdev = 0.687/0.761/0.925/0.097 ms</syntaxhighlight><br />
* No exemplo foram enviados quatro pacotes ICMP, cada um com um número de seqüência (''icmp_seq''), os quais foram recebidos com sucesso com o tempo de viagem assinalado (''time'').<br />
* Cada pacote tem ainda um tempo de vida (''ttl – time to live''), o qual é decrementado em cada roteador, sendo o pacote descartado quando chegar a zero. Isto evita pacotes perdidos na rede.<br />
* Quando o ping é interrompido (CRTL-C), uma estatística é apresentada indicando o percentual de pacotes transmitidos, recebidos e perdidos.<br />
* O tempo de viagem (''rtt – round trip time'') mínimo (''min''), médio (''avg'') e máximo (''max'') é calculado, assim como o desvio padrão (''mdev'')<br />
Exercício:</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Envie '''ping4''' para diferentes ''hosts'' e compare os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No endereço local de ''loopback'';</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidores externos:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">ifsc.edu.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.uol.com.br</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">www.aaa.jp</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta dos '''ping''' realizados:</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre ping para diferentes destinos.</span><br />
### <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre respostas recebidas de um mesmo destino.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Consulte as páginas '''man''' e teste o ping com os parâmetros abaixo e descreva suas funcionalidades:<br />-c count<br />-i intervalo<br />-s packetsize<br />-t ttl (para um site distante inicie com 1 e vá incrementando, observe as mensagens). Com essa estratégia é possível mapear os roteadores no caminho entre a origem e o destino de um pacote e é exatamente a estratégia utilizada pelo '''traceroute'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"><span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Observe que também é possível realizar ping em endereços no formato IPv6, desde que seu computador tenha IPv6 configurado, por exemplo:</span> <syntaxhighlight lang=bash> ping6 ipv6.br </syntaxhighlight></span><br />
# <span style="color: green" data-mce-style="color: green;"><span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente o ping6 para outros sites.</span> </span><br />
<br />
===traceroute===<br />
O '''traceroute''' é capaz de traçar uma rota aproximada entre dois ''hosts''. Este comando usa mensagens ICMP. Para determinar o nome e o endereço dos roteadores entre a fonte e o destino, o traceroute na fonte envia uma série de datagramas IP ordinários ao destino. O primeiro datagrama tem o TTL (''time to live'' – tempo de vida) igual a 1, o segundo 2, o terceiro 3, e assim por diante, e inicia temporizadores para cada datagrama. Quando o enésimo datagrama chega ao enésimo roteador, este verifica que o tempo de sobrevida do datagrama acaba de terminar. Pelas regras do IP, o datagrama é então descartado e uma mensagem ICMP de advertência tempo de vida excedido é enviada a fonte com o nome do roteador e seu endereço IP. Quando a resposta chega de volta a fonte, a mesma calcula o tempo de viagem em função dos temporizadores.<br />
<br />
O '''traceroute''' envia datagramas IP encapsulados em segmentos UDP a um host destino. Todavia escolhe um número de porta destino com um valor desconhecido (maior que 30000), tornando improvável que o host destino esteja usando esta porta. Quando o datagrama chega ao destino uma mensagem ICMP porta inalcançável é gerada e enviada a origem. O programa traceroute precisa saber diferenciar as mensagens ICMP recebidas – tempo excedido e porta inalcançável – para saber quando a rota foi concluída.<br />
<br />
* Exemplo:<syntaxhighlight lang=bash><br />
traceroute 191.36.8.3<br />
<br />
traceroute to 191.36.8.3 (191.36.8.3), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.444 ms 1.709 ms 2.097 ms<br />
2 172.18.255.251 (172.18.255.251) 0.138 ms 0.151 ms 0.152 ms<br />
3 191.36.8.3 (191.36.8.3) 1.544 ms 1.551 ms 1.550 ms </syntaxhighlight><br />
<br />
NOTA: O comando '''traceroute''' pode ser executado com o parâmetro -I. Esse comando força o '''traceroute''' a utilizar mensagens ICMP. Outra opção é utilizar o comando com o parâmetro -T, forçando o '''traceroute''' a utilizar o protocolo TCP para transmissão de seus pacotes. Caso nenhum dos parâmetros (-I ou -T) seja utilizado o '''traceroute''' utiliza o protocolo UDP como padrão. Visando barrar o tráfego de torrent em diversas redes, o Firewall bloqueia as mensagens UDP. Deste modo pode não ser possível executar o comando traceroute em algumas redes sem o uso dos parâmetro -I ou -T. <br />
<br />
O exemplo mostra a rota dos pacotes entre um computador do Lab. Redes (191.36.8.3) e o servidor ''www'' do campus (191.36.8.3). Observe que para cada roteador são realizados três amostras de tempo de ida e volta.<br />
<br />
* Outro exemplo:<syntaxhighlight lang=bash><br />
traceroute www.polito.it<br />
<br />
traceroute to www.polito.it (130.192.181.193), 30 hops max, 60 byte packets<br />
1 _gateway (191.36.9.254) 1.326 ms 1.410 ms 1.620 ms<br />
2 172.18.255.251 (172.18.255.251) 0.172 ms 0.183 ms 0.184 ms<br />
3 sw5-pop-wireless-backup-radio.remep.pop-sc.rnp.br (200.237.201.153) 2.574 ms 2.885 ms 3.114 ms<br />
4 * * *<br />
5 popsc-rt21-2189.pop-sc.rnp.br (200.237.202.49) 1.743 ms 1.890 ms 1.882 ms<br />
6 sc-lansc-rt21.bkb.rnp.br (200.143.253.109) 0.698 ms 0.681 ms 0.680 ms<br />
7 200.143.255.140 (200.143.255.140) 11.554 ms 11.640 ms 11.607 ms<br />
8 br-rnp.redclara.net (200.0.204.213) 12.710 ms 12.509 ms 12.217 ms<br />
9 us-br.redclara.net (200.0.204.9) 128.588 ms 128.600 ms 128.723 ms<br />
10 redclara-gw.par.fr.geant.net (62.40.125.168) 224.711 ms 224.812 ms 224.744 ms<br />
11 ae5.mx1.gen.ch.geant.net (62.40.98.182) 232.127 ms 232.146 ms 232.059 ms<br />
12 ae6.mx1.mil2.it.geant.net (62.40.98.81) 238.833 ms 238.855 ms 238.820 ms<br />
13 garr-gw.mx1.mil2.it.geant.net (62.40.125.181) 237.648 ms 238.871 ms 238.870 ms<br />
14 rx1-mi2-rx1-to1.to1.garr.net (90.147.80.218) 240.543 ms 240.734 ms 240.797 ms<br />
15 rx1-to1-ru-polito.to1.garr.net (193.206.132.34) 242.406 ms 242.406 ms 242.771 ms<br />
</syntaxhighlight><br />
<br />
*Exercício:<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Traçar a rota dos pacotes entre seu computador e diferentes ''hosts'':</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor ifsc.edu.br.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">servidor www.sorbonne.fr</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as diferenças entre os tempos de resposta:</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre '''traceroutes''' para diferentes destinos.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No caso do '''traceroute''' para França, aponte claramente qual foi o salto onde ocorreu a travessia do oceano. Como você chegou a essa conclusão?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Entre as três medidas apresentadas para cada salto.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que justifica um possível tempo de resposta menor para um salto posterior? Por exemplo: pode-se obter no salto 12, no exemplo do traceroute para www.polito.it, um tempo de '''238.833 ms''' e no salto 13 um tempo de '''237.648 ms'''.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique as linhas com o caracter *.</span><br />
<br />
===Usando as ferramentas ping, ifconfig, ip e traceroute em um cenário com o Imunes===<br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Elaborar um cenário com 2 PCs interligados por dois roteadores,:</span> [[Arquivo:2PCs+2Roteadores.png | 400px| Rede básica]]:<br />
*#Execute o Imunes.<br />
*#Através do menu lateral monte uma rede conforme apresentada na figura.<br />
*#Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ''ifconfig'' ou ''ip a'' em cada PC e nos roteadores. Discuta os resultados no caso dos roteadores.</span><br />
# # <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Modifique o retardo de um dos links para 50ms; </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um ping do PC1 em direção ao PC2; Qual o atraso? </span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Execute um traceroute entre PC1 e PC2 e explique o resultado obtido quando comparado com a figura, em relação aos números de IP apresentados.</span><br />
<br />
=Ferramentas básicas: WireShark, encapsulamento e tcpdump =<br />
==Objetivos==<br />
Após este laboratório o aluno deverá ser capaz de:<br />
* utilizar a ferramenta wireshark para captura de pacote:<br />
** funções básicas de filtragem na captura e no display;<br />
** verificação de estruturas de pacotes;<br />
* consolidar o conceito de protocolo e de camadas de protocolos através da análise de troca de pacotes com ping e traceroute usando:<br />
** as janelas com detalhes dos pacotes e encapsulamentos;<br />
** a opção de ''flow graph'' para visualizar as trocas de mensagens.<br />
<br />
==Sobre o analisador Wireshark==<br />
<br />
O analisador de pacotes exibe os conteúdos de todos os campos dentro de uma mensagem de protocolo. Para que isso seja feito, o analisador de pacotes deve “entender” a estrutura de todas as mensagens trocadas pelos protocolos. <br />
<br />
Suponha que estamos interessados em mostrar os vários campos nas mensagens trocadas pelo protocolo HTTP na Figura 5. O analisador de pacotes entende o formato dos quadros Ethernet, e desta forma pode identificar o datagrama IP dentro de um quadro. Ele também entende o formato do datagrama IP, para que ele possa extrair o segmento TCP dentro do datagrama IP. Ele entende a estrutura do segmento TCP, para que possa extrair a mensagem HTTP contida no segmento. Finalmente, ele entende o protocolo HTTP e então, por exemplo, sabe que os primeiros bytes de uma mensagem HTTP contém a cadeia “GET”, “POST” ou “HEAD”. <br />
<br />
Nós utilizaremos o ''sniffer'' Wireshark (http://www.wireshark.org) para estes laboratórios, o que nos permite exibir os conteúdos das mensagens sendo enviadas/recebidas de/por protocolos em diferentes camadas da pilha de protocolos. Tecnicamente falando, Wireshark é um analisador de pacotes que pode ser executado em computadores com Windows, Linux/UNIX e MAC.<br />
<br />
É um analisador de pacotes ideal para nossos laboratórios, pois é estável, tem uma grande base de usuários e é bem documentado incluindo um guia de usuário (http://www.wireshark.org/docs/wsug_html/), páginas de manual (http://www.wireshark.org/docs/man-pages/), e uma seção de FAQ detalhada (http://www.wireshark.org/faq.html), funcionalidade rica que inclui a capacidade de analisar mais que 500 protocolos, e uma interface com o usuário bem projetada. Ele funciona em computadores ligados a uma Ethernet para conectar-se à Internet, bem como protocolos ponto a ponto, tal como PPP.<br />
<br />
==Identificando os campos da interface do Wireshark==<br />
Quando você executar o programa Wireshark, a interface com o usuário exibida na Figura abaixo aparecerá. Inicialmente, nenhum dado será apresentado nas janelas. A interface do Wireshark tem seis componentes principais: <br />
# Os menus de comandos são localizados no topo da janela. Por enquanto, interessam apenas os menus ''File'' e ''Capture''. O menu ''File'' permite salvar dados de capturas de pacotes ou abrir um arquivo contendo dados de capturas de pacotes previamente realizadas, e sair da aplicação. O menu ''Capture'' permite iniciar uma captura de pacotes; <br />
# A barra de ferramentas contém os comandos de menu que são mais frequentemente utilizados. Há atalhos para abrir ou salvar dados de captura de pacotes e para iniciar ou parar uma captura de pacotes; <br />
# Abaixo da barra de ferramentas, está o campo de filtragem de pacotes exibidos. Nele podem ser digitados nome de protocolo ou outra informação apresentada na janela de listagem de pacotes. Apenas os pacotes que correspondem ao filtro são exibidos; <br />
# A janela de listagem de pacotes apresenta um resumo de uma linha para cada pacote capturado, incluindo o número do pacote (atribuído pelo Wireshark; este não é o número do pacote contido no cabeçalho de qualquer protocolo), o tempo que o pacote foi capturado, os endereços fonte e destino do pacote, o tipo de protocolo, e informação específica do protocolo contida no pacote. A lista de pacotes pode ser ordenada conforme qualquer uma destas categorias clicando no nome de uma coluna correspondente. O campo tipo do protocolo lista o protocolo de mais alto nível que enviou ou recebeu este pacote, i.e., o protocolo que é a fonte ou o último sorvedouro para este pacote; <br />
# A janela de detalhes de cabeçalho de pacotes fornece detalhes sobre o pacote selecionado na janela de listagem de pacotes. Para selecionar um pacote, basta clicar sobre ele com o botão esquerdo do mouse na janela de listagem de pacotes. Os detalhes apresentados incluem informações sobre o quadro Ethernet e o datagrama IP que contém o pacote. A quantidade de detalhes exibida pode ser expandida ou contraída. Se o pacote foi carregado sobre TCP ou UDP, detalhes correspondentes também são apresentados, os quais também podem ser contraídos ou expandidos. Finalmente, detalhes sobre o protocolo de mais alto nível que enviou ou recebeu este pacote também são apresentados; <br />
# A janela de conteúdo de pacotes mostra o conteúdo inteiro do quadro capturado, nos formatos ASCII e hexadecimal.<br />
<br />
[[Arquivo:Wireshark_interface_usuario.png | 700px| Figura 3 - Interface com o usuário do Wireshark]]<br />
<br />
==Verificando pacotes do ping (ICMP REQUEST/REPLY)==<br />
===Treinamento=== <br />
# Inicie o Wireshark. Inicialmente as janelas estarão vazias, pois não há captura de pacotes em progresso. O Wireshark pode ser aberto pela janela de aplicativos ou no terminal, conforme abaixo:<syntaxhighlight lang=bash><br />
wireshark &</syntaxhighlight> <br />
# Para iniciar uma captura de pacotes, selecione o menu Capture e depois Interfaces. Provavelmente sua interface de rede será a ''eth0'', duplo clique sobre a mesma. <br />
# Isso faz com que a janela de interfaces de rede disponíveis seja apresentada (Figura 4); [[Arquivo:Wireshark_interfaces_rede.png |thumb | 400px| Figura 4 - Interfaces de rede no Wireshark]]<br />
# Como nada está acontecendo na rede, a janela apresenta o conteúdo vazio;<br />
# Em outro terminal, execute um comando ping (endereço na saída da nossa rede - ver aula anterior):<syntaxhighlight lang=bash><br />
ping -c 3 200.237.201.153</syntaxhighlight><br />
# Ao voltar para a janela do Wireshark, houve a captura de todos os três pacotes envolvidos no process;<br />
# Pare a captura de pacotes: <syntaxhighlight lang=bash><br />
Capture >> Stop</syntaxhighlight> <br />
# Para testar as capacidades de filtragem, vamos inserir a cadeia “icmp” (sem as aspas e em minúsculo) no especificação do filtro de exibição e depois selecionar ''Apply'' (ou Enter). Observe que somente os pacotes envolvidos no ping estão sendo mostrados. Os resultados obtidos devem ser similar a tela mostrada na Figura 5. <br />
# Selecione a primeira mensagem ECHO REQUEST: as informações dos cabeçalhos do quadro Ethernet, do datagrama IP, do pacote ICMP aparecem na janela de cabeçalhos de pacotes. É possível ver os detalhes, expandido ou comprimindo os itens com um clique na seta ao lado deles. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Selecione uma mensagem ECHO REPLY. Observe:<br />
## Endereço IP de origem e de destino;<br />
## Endereço MAC de origem e destino.<br />
# Saia do Wireshark.<br />
<br />
[[Arquivo:TelaWiresharkPing.png | 700px| Figura 5 - Tela Wireshark - Ping]]<br />
<br />
===<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tarefa</span>===<br />
<br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra o Wireshark em modo captura. </span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Abra um terminal e faça um "ping -c 3" para um site conhecido (você pode usar o nome: www.ifsc.edu.br por exemplo).</span><br />
# <span style="color: rgb(0, 0, 0);" data-mce-style="color: #000000;">Pare a captura de pacotes no Wireshark.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um filtro icmp no display. Recorte a tela observada e indique os pacotes ICMP ECHO REQUEST. Anote quem são os endereços IP e MAC que aparecem no pacote IP e Frame Ethernet.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aplique um comando Flow Graph e mostre a troca de mensagens do ping através de um recorte da tela;</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Statistics >> Flow Graph >> Abrirá uma nova janela com várias informações >> Aplique o filtro (Flow type:) '''ICMP Flows''' na base da janela. Salve esta tela no relatório.</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Feche esta janela.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Crie um filtro para mostrar somente pacotes icmp que saem da sua máquina (ver filtro [https://medium.com/canivete-sui%C3%A7o-hacker/wireshark-guia-r%C3%A1pido-de-filtros-49dee2bcf1b ip.src]). Faça um recorte das telas de criação do filtro (mostrando o filtro).</span><br />
<br />
==Tcpdump==<br />
<br />
#Leia atentamente o manual do tcpdump , principalmente os exemplos: <syntaxhighlight lang=bash> man tcpdump </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra um terminal e faça um ping: <syntaxhighlight lang=bash> ping4 ifsc.edu.br </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Abra outro terminal e faça um tcpdump: <syntaxhighlight lang=bash> sudo tcpdump </syntaxhighlight> e, com o uso de parâmetros (filtros) apropriados, faça com que o tcpdump mostre:<br />
##Capture todos os pacotes oriundos e destinados à sua máquina.<br />
##Idem anterior com a ''flag'' ''-vvv'' ativa e, em seguida, a ''flag'' -n.<br />
##*Qual é a função dessas ''flags''?<br />
##Capture somente os pacotes oriundos de sua máquina.<br />
##*Anote o comando utilizado.<br />
##Capture somente pacotes destinados à sua máquina.<br />
##*Anote o comando utilizado.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Repita os comandos acima e, com o uso de parâmetros apropriados, faça com que o tcpdump armazene os dados em um arquivo denominado “pacotes_capturados'''X'''.pcap“ (um arquivo para cada item acima, onde '''X''' é o número do item). Anote os comandos no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Procure um dos arquivos salvos, com o navegador de arquivos de sua máquina, dê um duplo clique sobre o mesmo.<br />
##Com qual programa foi aberto o arquivo?<br />
<br />
=Desvendando o HTTP com Wireshark=<br />
<br />
Fonte base: [http://www.ebah.com.br/content/ABAAABZ6QAD/wireshark-http Wireshark - HTTP]<br />
<br />
==Objetivos==<br />
*Baseado na pequena introdução ao Wireshark estamos prontos para utilizar o mesmo para investigar protocolos em operação.<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A interação básica GET/resposta do HTTP.<br />
*#A interação manual GET/resposta do HTTP utilizando o telnet.<br />
*#Diferenciação do comportamento das versões 1.0 e 1.1 do protocolo HTTP.<br />
<br />
==A Interação Básica GET/Resposta do HTTP==<br />
<br />
#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:<br />
##inicie o navegador;<br />
##limpe o cache do mesmo (teclas de atalho para o Google Chrome: '''Ctrl + Shift + Del''');<br />
##inicie o Wireshark, como descrito no '''Ferramentas básicas''';<br />
##inicie a captura de pacotes;<br />
##digite o seguinte URL no navegador http://redes.sj.ifsc.edu.br/;<br />
##pare a captura de pacotes;<br />
##digite “http” (somente as letras, sem as aspas) na caixa de texto de especificação do filtro de exibição, de tal forma que apenas as mensagens HTTP capturadas serão exibidas na janela de listagem de pacotes. (Só estamos interessados em HTTP desta vez, e não desejamos ver todos os pacotes capturados).[[Arquivo:HTTP_Wireshark.png |thumb | 300px| Fig.1 Requisição e Resposta HTTP]]<br />
#O exemplo da figura 1 mostra na janela de listagem de pacotes duas mensagens HTTP capturadas:<br />
##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.<br />
##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).<br />
##A mensagem HTTP transportada em um segmento TCP, que é carregado em um datagrama IP, que é levado em um quadro Ethernet com 5728 bits no fio. Isso é observado de baixo para cima na janela de detalhes do cabeçalho do pacote selecionado. O Wireshark exibe informações sobre o quadro, IP, TCP e HTTP. Você deve expandir as informações, por exemplo, do HTTP clicando na seta ao lado esquerdo de “Hypertext Transfer Protocol”. Observando as informações das mensagens HTTP GET e de resposta. Você consegue inclusive enxergar a mensagem mostrada no navegador: '''RED29004! Página de teste.'''<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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.<br />
##O seu navegador executa HTTP 1.0 ou 1.1?<br />
##Qual a versão de HTTP do servidor?<br />
##Quais idiomas (se algum) o seu navegador indica ao servidor que pode aceitar?<br />
##Qual o endereço IP do seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o número da porta utilizada no seu computador?<br />
##E do servidor redes.sj.ifsc.edu.br?<br />
##Qual o código de status retornado do servidor para o seu navegador?<br />
##Quando o arquivo em HTML que você baixou foi modificado no servidor pela última vez?<br />
##Quantos bytes de conteúdo são baixados pelo seu navegador?<br />
##Encontre a mensagem '''Redes de Computadores IFSC - SJ - Telecomunicacoes! - Pagina de teste'''. Onde (em qual campo) encontra-se?<br />
##Qual a diferença entre os endereços IP e porta de origem e destino entre a mensagem GET e a de resposta do HTTP?<br />
<br />
==Interação Básica GET/Resposta do HTTP usando TELNET e REQUISIÇÃO MANUAL==<br />
<br />
# Vamos repetir o acesso aos links acima, porém sem usar o navegador. A ideia é que nós façamos o papel de navegador. Isso deve ser feito com os seguintes passos:<br />
## Coloque o Wireshark para capturar pacotes <br />
## Abra um terminal de texto no Linux.<br />
## Execute este comando: <syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Após aparecer esta linha: <syntaxhighlight lang=text><br />
Trying 200.135.37.75...<br />
Connected to redes.sj.ifsc.edu.br.<br />
Escape character is '^]'.</syntaxhighlight>digite o seguinte (<Método> <URL> <Protocolo>/<Versão>):<syntaxhighlight lang=text><br />
GET / HTTP/1.0<br />
</syntaxhighlight> <Enter> <Enter><br />
##Pare a captura de pacotes.<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique a página html que foi enviada como resposta. Respeita o protocolo HTTP (observe o cabeçalho)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No Wireshark compare o resultado das execuções desses comandos com o que se viu nas capturas Wireshark com acesso pelo navegador, em resumo, compare a troca de mensagens via navegador e terminal (cabeçalhos). Qual a diferença em cada caso?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça um pedido em que o recurso é inexistente no servidor (ex: página html com nome/URL inexistente). Observe a resposta. Qual é o código da mensagem recebida?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1, e tente inferir a diferença da versão 1.0. Note que o GET nesta versão deve ser realizado com o campo Host:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para fechar a conexão (após o duplo Enter)?<br />
# Refaça a conexão com o servidor:<syntaxhighlight lang=bash><br />
telnet -4 redes.sj.ifsc.edu.br 80<br />
</syntaxhighlight><br />
## Refaça o pedido, mas agora utilizando o HTTP/1.1:<syntaxhighlight lang=bash><br />
GET / HTTP/1.1<br />
HOST: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter>/<Enter><br />
## Antes do fechamento da conexão, faça um novo pedido na conexão já aberta:<syntaxhighlight lang=bash><br />
GET /Redes_arq1.html HTTP/1.1<br />
Host: redes.sj.ifsc.edu.br</syntaxhighlight> <Enter> <Enter><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O que explica a diferença de tempo para fechamento de conexão entre as versões HTTP 1.0 e 1.1? <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descreva qual seria o procedimento para o download de dois objetos, via telnet, nos protocolos HTTP 1.0 e 1.1?<br />
<br />
=Desvendando o HTTP com Wireshark, parte 2=<br />
<br />
==Objetivos==<br />
*Explorar vários aspectos do protocolo HTTP:<br />
*#A requisição condicional.<br />
*#Formatos de mensagens HTTP.<br />
*#Os processos e protocolos envolvidos ao baixar arquivos grandes em HTML.<br />
*#Os processos envolvidos ao baixar arquivos em HTML com objetos incluídos.<br />
<br />
==A Interação HTTP GET Condicional/Resposta==<br />
<br />
#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:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br. Seu navegador deve exibir um arquivo em HTML muito simples com duas linhas;<br />
##Pressione o botão “refresh” no navegador (ou digite o URL novamente);<br />
##No Wireshark 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. Você deve ter obtido algo como apresentado na Figura 1; [[Arquivo:GET_Condicional.png|thumb | 400px| Figura 1 - Captura explicitando o GET condicional]]<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
##Inspecione o conteúdo da primeira mensagem - HTTP GET - do seu navegador para o servidor redes.sj.ifsc.edu.br. Você vê uma linha “If-Modified-Since”?<br />
##Inspecione o conteúdo da resposta do servidor, segunda mensagem. O servidor retornou explicitamente o conteúdo do arquivo? Como você pode dizer isso?<br />
##Agora inspecione o conteúdo da terceira mensagem - HTTP GET - do seu navegador para o servidor. Você vê uma linha “If-Modified-Since”? Caso a resposta seja afirmativa, qual informação segue o cabeçalho “If-Modified-Since”?<br />
##Qual é o código de status e a frase retornada do servidor na resposta à terceira mensagem HTTP GET? É diferente do código de retorno da primeira mensagem? Qual é o código?<br />
##Na terceira resposta, o servidor retornou explicitamente o conteúdo do arquivo? Explique.<br />
##Qual o tamanho da primeira e terceira mensagem de retorno (respostas) do servidor?<br />
<br />
==Baixando Documentos Longos==<br />
Antes de qualquer experimento deve-se desabilitar algumas funcionalidades do kernel do LINUX, para que os experimentos reflitam a teoria.<br />
<br />
Caso sua interface de rede não seja a '''eth0''' adapte o comando substituindo eth0 pelo nome da sua interface de rede:<br />
<br />
<syntaxhighlight lang=bash> sudo ethtool --offload eth0 gso off tso off sg off gro off </syntaxhighlight><br />
<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Despreze a mensagem de erro</span><br />
<br />
# 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:<br />
## Inicie o navegador web;<br />
## Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
## Inicie o Wireshark;<br />
## Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq2.html. Seu navegador deve exibir um documento bastante longo e criativo :);<br />
## Faça um atualização da página (F5);<br />
## 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.<br />
# Na janela de listagem de pacotes, clique sobre a resposta do servidor ('''200 OK (text/html)''')<br />
# Na janela de detalhes do pacote, clique sobre o nono ".... '''Reassembled TCP Segments'''" <br />
#* 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 série de linhas de cabeçalho, seguida por uma linha em branco, seguida pela carga útil (''Content-Length''). Nessa resposta, a carga útil do arquivo em HTML é bastante longo, e a informação de '''12049 bytes''' é muito grande para caber em um único segmento TCP. Assim sendo, a resposta HTTP é 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. Aqui fica evidente a relação entre camadas: Na camada de aplicação uma grande mensagem que é quebrada pela camada de transporte para "dar conta" de fazer o serviço de entrega.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões:<br />
## Quantas mensagens HTTP GET foram enviadas pelo seu navegador? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
## Quantas respostas HTTP sua máquina recebeu?<br />
## Quantos segmentos TCP foram necessários para carregar a resposta?<br />
## Qual é o código de status e a frase associada com a resposta à mensagem HTTP GET? Obs.: Observe os campos do cabeçalho de uma resposta HTTP.<br />
## Quantos segmentos TCP foram necessários para obtenção da segun resposta do servidor?<br />
## O que explica a diferença entre a primeira e segunda requisições?</span><br />
<br />
==Documentos HTML com Objetos Incluídos==<br />
<br />
#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 navegador baixa um arquivo principal com objetos incluídos, no nosso exemplo, imagens que estão armazenadas em outros servidores. Faça o seguinte:<br />
##Inicie o navegador web;<br />
##Limpe o cache do seu navegador ('''Ctrl + Shift + Del''');<br />
##Inicie o Wireshark;<br />
##Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_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 são conteúdos do arquivo em HTML e nem estão depositadas no mesmo servidor, ao invés disso, há um URL para cada imagem no arquivo em HTML. Como discutido no livro, seu navegador terá que baixar estas imagens dos locais correspondentes. As imagens estão em docente.ifsc.edu.br;<br />
#Digite o URL no navegador http://redes.sj.ifsc.edu.br/Redes_arq4.html. Seu navegador deve exibir um arquivo pequeno em HTML com cinco imagens incluídas. Estas cinco imagens,diferentemente do caso anterior, estão depositadas no próprio sítio navegado;<br />
#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.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda às seguintes questões, separando as respostas para o acesso ao Redes_arq3.html e Redes_arq4.html (6 respostas):<br />
##Quantas mensagens HTTP GET foram enviadas pelo seu navegador em cada acesso? (<span style="color:red;">desconsidere a requisição e resposta (erro) da mensagem favicon</span>)<br />
##Para quais endereços na Internet (URI = Host + URL) estas mensagens foram enviadas em cada acesso?<br />
##Você consegue dizer se o seu navegador baixou imagens com ou sem paralelismo? Explique e diferencie o comportamento em cada um dos casos.<br />
<br />
==HTTPS==<br />
*O Hyper Text Transfer Protocol Secure (HTTPS) é uma implementação do protocolo HTTP sobre uma camada adicional de segurança que utiliza o protocolo SSL/TLS e permite a transmissão de dados numa conexão criptografada através de certificados digitais.<br />
*Caso tenha interesse em analisar troca de mensagens HTTPS e verificar seus conteúdos siga o roteiro [https://www.comparitech.com/net-admin/decrypt-ssl-with-wireshark/#:~:text=Configure%20Wireshark%20to%20decrypt%20SSL&text=Open%20Wireshark%20and%20click%20Edit,)%2DMaster%2DSecret%20log%20filename. ''How to Decrypt SSL and TLS Traffic Using Wireshark'']<br />
<br />
<br />
=Serviço de Nomes (DNS)=<br />
<br />
==Objetivos==<br />
O Domain Name System (DNS) traduz nomes de hosts em endereços Internet Protocol (IP), preenchendo uma lacuna crítica na infraestrutura da Internet. Neste laboratório, observaremos mais de perto:<br />
#o lado cliente do DNS e<br />
#uma pequena análise do protocolo<br />
<br />
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.<br />
<br />
===Leitura recomendada===<br />
*[[Detalhes sobre DNS]]<br />
<br />
==Consulta simples ao DNS gerada a partir de um comando ping==<br />
O comando ping pode ser usado tanto com um endereço IP como com um nome de host. Em última instância, ele sempre enviará pacotes para um endereço IP. No caso de ser usado o endereço de host, ele tentará resolver (mapear) este nome em um endereço IP usando um servidor DNS (local). Ele gera uma pergunta para o servidor (ou para os servidores, caso exista mais de um configurado). Esta experiência mostra como verificar os servidores instalados e, através de uma captura de pacote mostra a estrutura dos cabeçalhos DNS.<br />
<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Inicialmente consulte e anote quem são os servidores DNS instados na sua máquina. É para estes servidores que serão conduzidas as perguntas DNS. Use a ferramenta nm-tool ou acesso ao arquivo de configuração do sistema:</span><br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">nmcli dev show | grep DNS</span> ou<br />
#: <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">cat /etc/resolv.conf</span><br />
# Prepare o wireshark para capturar pacotes. Feche o mozilla ou qualquer outro software de rede parar evitar tráfego DNS que possa vir a confundi-lo.<br />
# Execute o ping para um endereço de host conhecido<br />
#: ping4 www.registro.br<br />
# Pare a captura de pacotes no Wireshark e coloque um filtro de display para mostrar apenas mensagens DNS e de ICMP<br />
#: dns || icmp<br />
# Observe os pacotes capturados. Em particular foque no pacote de pergunta que deve ser similar ao mostrado abaixo e deve estar direcionado a um dos servidores DNS. Nos ''flags'' do header do pacote DNS é possível observar que é um QUERY (pergunta) a ser resolvido de forma recursiva. A pergunta propriamente dita está no campo QUERIES, onde é colocado o nome a ser resolvido e o tipo do registro solicitado (tipo A) que indica resolução de nome. <br />
#: <br />
#: [[Arquivo:DNS-Tela1-Wireshark.jpg | 900px| Estrutura de uma pergunta simples DNS]]<br />
#: <br />
#: <br />
# Foque agora um pacote de resposta do servidor para o cliente. Deve ter uma estrutura similar ao mostrado abaixo. Nos flags do header do pacote DNS é possível observar que é uma resposta. A resposta propriamente dita está no campo ANSWERS (ele também repete a pergunta no campo QUERIES). Note que podem haver vários registros (RR) retornados, cada um com um tipo. No exemplo abaixo também é retornada uma lista de servidores autorizados (RR tipo NS). Também é retornado o endereço IP destes servidores através de RRs adicionais do tipo A (inclusive endereços IPv6).<br />
#: <br />
#: <br />
#: [[Arquivo:DNS-Tela2-Wireshark.jpg | 900px| Estrutura de uma resposta simples DNS]]<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas, baseado nos pacotes "''Standard query''", "''Standard query response''" e comandos do terminal:<br />
## Quem são os servidores DNS da sua máquina?<br />
## O ping gerou pergunta para cada um deles?<br />
## Qual o tipo da RR associada a pergunta (''Queries''). O que significa?<br />
## Qual endereço IP retornado da solicitação da resolução de www.registro.br?<br />
## Qual endereço IP usado no ping (ver pacote REQUEST ICMP)?<br />
## Qual protocolo de transporte, camada 4, que foi usado para transportar as mensagens de aplicação DNS?<br />
## No QUERY realizado foi solicitado consulta recursiva. O servidor aceitou esta solicitação? (ver a resposta do servidor)<br />
# Logo após o primeiro ping existe mais uma consulta DNS. Esta pergunta é realizada através de uma mensagem do tipo PTR. O ping está tentando verificar qual é o nome da máquina que realmente está respondendo. É o DNS reverso, nesse tipo de colsulta se fornece um IP e o servidor devolve o nome da máquina.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas a serem respondidas:<br />
## Qual o IP que se pretende resolver?<br />
## Qual o nome retornado?<br />
## O nome retornado é www.registro.br? Sim ou não? Explique.</span><br />
<br />
==Consultas DNS por meio de ferramentas especializadas==<br />
# Usando o programa [http://manpages.ubuntu.com/manpages/precise/man5/hosts.5.html host], [http://manpages.ubuntu.com/manpages/trusty/en/man1/nslookup.1.html Nslookup] ou [http://manpages.ubuntu.com/manpages/precise/man1/dig.1.html dig], que são executados no terminal, descubra e anote no relatório os endereços IP associados aos seguintes nomes de hosts (máquinas):<br />
#* mail.ifsc.edu.br<br />
#* www.google.com<br />
#* www.gmail.com<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora descubra e anote no relatório quem é o servidor DNS responsável por cada um dos '''domínios''' (p.e.: ifsc.edu.br) dos nomes acima. Para isso consulte o valor do registro NS associado a esses domínios. Por exemplo, com o programa ''host'' ou ''dig'' isso pode ser feito assim: <syntaxhighlight lang=bash><br />
host -t ns ifsc.edu.br<br />
dig -t ns ifsc.edu.br<br />
</syntaxhighlight><br />
# O serviço DNS fornece outras informações além do endereço IP associado a cada nome de domínio e/ou máquina. Por exemplo, como ele pode-se descobrir que ''host'' recebe emails em um determinado domínio. Isso é utilizado pelos MTA (''Mail Transfer Agent'') mundo afora para entregarem emails para seus destinatários (lembre que isso se faz com o protocolo SMTP). Para descobrir essa informação, deve-se consultar o registro MX (''Mail eXchange'') de um domínio. Novamente as ferramentas a ser utilizada nesse caso podem ser ''host'' ou ''dig''. Por exemplo: <syntaxhighlight lang=bash><br />
host -t mx ifsc.edu.br<br />
dig -t mx ifsc.edu.br<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Descubra e anote no relatório quem é o servidor de emails nos seguintes domínios:<br />
#* gmail.com<br />
#* hotmail.com<br />
#* ifsc.edu.br<br />
# 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65<br />
</syntaxhighlight> ... 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: <syntaxhighlight lang=bash><br />
dig -x 200.135.37.65 +short<br />
</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça uma consulta iterativa com ''dig'' e responda:<syntaxhighlight lang=bash><br />
dig +trace @8.8.8.8 mail.ru. </syntaxhighlight><br />
##Qual foi o RLD (''Root Level Domain'') consultado?<br />
##Qual o TLD (''Top Level Domain'') consultado?<br />
##Qual o SLD (''Second Level Domain'') consultado?<br />
##Como você sabe que foram esses os LDs consultados?<br />
<br />
==Algumas consultas AAAA==<br />
Vamos expandir um pouco nossos horizontes e fazer algumas consultas envolvendo IPv6.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No terminal de sua máquina faça uma consulta e responda: qual o endereço IPv6 dos hosts? Por exemplo: <syntaxhighlight lang=bash><br />
dig AAAA google.com<br />
host -t AAAA google.com </syntaxhighlight><br />
##www.ufsc.br<br />
##www.nyt.com<br />
##ipv6.br<br />
##www.microsoft.com<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Agora vamos fazer a consulta reversa. Qual é o nome de host dos seguintes endereços? Por exemplo: <syntaxhighlight lang=bash><br />
dig -x 2600:1419:1e00:38e::356e<br />
dig -x 2600:1419:1e00:38e::356e +short<br />
host 2600:1419:1e00:38e::356e </syntaxhighlight><br />
##2801:84:0:2::10<br />
##2001:12d0:0:126::183:244<br />
##2001:12ff::10<br />
##2600:9000:21ed:fa00:1:5a19:8b40:93a1<br />
<br />
==Exemplos de arquivos de um ''Second Level Domain'' fictício==<br />
*Exemplo de arquivos de configuração de um servidor [https://www.isc.org/downloads/bind/ BIND]<br />
/etc/bind/db.redes <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 192.168.1.101<br />
www IN A 192.168.1.102<br />
www IN A 192.168.1.103<br />
www IN A 192.168.1.104<br />
www IN A 192.168.1.105<br />
www IN A 192.168.1.106<br />
www IN A 192.168.1.107<br />
mail IN A 192.168.1.109<br />
ftp IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
<br />
/etc/bind/db.1.168.192 (Zona reversa) <syntaxhighlight lang=bash><br />
$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2016090900 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
IN NS ns.redes.edu.br.<br />
101 IN PTR ns.redes.edu.br.<br />
102 IN PTR www.redes.edu.br.<br />
108 IN PTR ftp.redes.edu.br.<br />
109 IN PTR mail.redes.edu.br. </syntaxhighlight><br />
<br />
=Camada de Aplicação: Colocando no "ar" aplicações servidoras=<br />
<br />
==Objetivos==<br />
*Testar serviços de rede na camada de aplicação.<br />
*Construir uma pequena internet, colocando dois serviços no "ar": um '''servidor ssh''', um '''servidor DNS''' e um '''web server''', .<br />
*Uma visão do posicionamento dos "pacotes de aplicação" capturados para cada um destes serviços.<br />
<br />
Os serviços são, portanto:<br />
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;"><br />
*serviço SSH: ''Secure Shell'', terminal remoto. Permite acessar um computador remoto através de um terminal.<br />
*serviço DNS: Vai permitir a navegação através de nomes de máquinas. Com este serviço vamos configurar o banco de dados de um servidor DNS, [https://www.isc.org/bind/ BIND]. Ele dará suporte a navegação por nomes de máquinas.<br />
*serviço WEB: permite hospedar e acessar remotamente páginas da Internet.<br />
</blockquote><br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:Internet_Servidores.png|800px|"Internet"]]<br />
<br />
==Servidor SSH==<br />
<br />
# Vamos usar o simulador '''Imunes''' para nos apropriarmos do sentimento do comportamento em camadas em uma rede simples. Construir no Imunes a rede a seguir ou, se preferir, importe o arquivo digitando no terminal: <syntaxhighlight lang=bash><br />
wget http://redes.sj.ifsc.edu.br/Camada_aplicacao.imn </syntaxhighlight><br />
# Inicie o '''Imunes''' e carregue o arquivo salvo (Camada_aplicacao.imn).<br />
# Iniciando a REDE: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Executando serviço SSH. O serviço SSH será iniciado no '''servidor SSH''' (SSH SERVER).<br />
## Primeiramente vamos atribuir uma senha ao usuário root no servidor SSH, por exemplo, atribua senha '''''root''''' (SSH SERVER) com o seguinte comando no terminal do SSH SERVER (duplo clique sobre a máquina SSH SERVER abre o terminal de comandos da mesma): <syntaxhighlight lang=bash><br />
passwd </syntaxhighlight><br />
##* <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Enquanto digita-se a senha o terminal nada apresenta, é normal</span>.<br />
##* Ao terminar de digitar a senha tecle <enter>. Será solicitado a confirmação da senha com o mesmo procedimento.</enter><br />
## Em seguida vamos fazer uma pequena configuração no '''servidor SSH''' (SSH SERVER), através do comando: <syntaxhighlight lang=bash><br />
echo PermitRootLogin yes >>/etc/ssh/sshd_config </syntaxhighlight><br />
## Iniciamos o serviço, através do comando: <syntaxhighlight lang=bash><br />
/etc/init.d/ssh start<br />
/etc/init.d/ssh reload </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira se o serviço está rodando: </span><syntaxhighlight lang=bash><br />
ps aux </syntaxhighlight><br />
##* Observe se há um processo do tipo, última coluna a direita: /usr/sbin/sshd<br />
## Agora vamos testar a conectividade do serviço fazendo uma acesso remoto, por exemplo, no terminal do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ssh 10.0.9.10 </syntaxhighlight><br />
##* Na primeira pergunta responda com yes<br />
##* Na segunda pergunta preencha com a senha: root<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@ssh:~#''',</span> isso significa que, apesar de você estar no terminal do pc2, vocês está conectado no SSH SERVER. Tudo que você digitar estará sendo executado no SSH SERVER.<br />
## No terminal do '''pc2''', que na verdade está conectado ao servidor '''SSH SERVER''', vamos deixar um ping testando a conectividade com o próprio '''pc2''': <syntaxhighlight lang=bash><br />
ping 10.0.8.20 </syntaxhighlight><br />
# Agora vamos capturar pacotes do ssh. Basta usar o Wireshark em qualquer interface onde passam os pacotes. Por exemplo, no '''router2'''.<syntaxhighlight lang=bash><br />
Clique com o direito do mouse sobre o router2 >> Wireshark >> eth0 </syntaxhighlight><br />
# Pare o ping.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''ssh'''. Mostre o encapsulamento de pacotes de aplicação e seu posicionamento na estrutura de pacotes.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Recorte a tela do Wireshark, filtrando os pacotes do '''icmp'''. Comprovando que os pacotes do ping estão passando pelo '''router2'''.</span><br />
# Para encerrar a conexão ao '''SSH SERVER''', no terminal do '''pc2''' digite: <syntaxhighlight lang=bash><br />
exit </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observe e salve que o prompt do seu terminal mudou para '''root@pc2:~#'''</span>, isso significa que a conexão foi encerrada.<br />
<br />
==Servidor DNS==<br />
<br />
===Criando um domínio de Internet===<br />
<br />
# Abra o terminal do '''DNS_Server''', vá até o diretório de configuração do BIND com o comando: <syntaxhighlight lang=bash><br />
cd /etc/bind </syntaxhighlight><br />
# Defina uma zona, um ''Second Level Domain'', de nome '''redes.edu.br'''. Isto é feito editando o arquivo '''named.conf.default-zones'''. No terminal do '''DNS_Server''' e digite:<syntaxhighlight lang=bash><br />
nano named.conf.default-zones </syntaxhighlight><br />
# Acrescente '''ao final''' do mesmo o seguinte conteúdo: <syntaxhighlight lang=bash><br />
zone "redes.edu.br" {<br />
type master;<br />
file "/etc/bind/db.redes";<br />
}; </syntaxhighlight><br />
#* Ao terminar de editar digite '''<CRTL> + X''', em seguida, '''Y''' e '''<Enter>'''.<br />
#* Este arquivo definirá uma nova zona (domínio) DNS.<br />
<br />
===Criando a base de dados relativa ao domínio===<br />
<br />
# Na zona criada atribua endereços IPv4 (A) as máquinas em '''db.redes: <syntaxhighlight lang=bash><br />
nano db.redes </syntaxhighlight><br />
# Cole o seguinte conteúdo no arquivo e salve:''': <syntaxhighlight lang=bash>$TTL 86400<br />
@ IN SOA ns.redes.edu.br. root (<br />
2022051200 ; Serial<br />
604800 ; Refresh<br />
86400 ; Retry<br />
2419200 ; Expire<br />
86400 ) ; Negative Cache TTL<br />
;<br />
@ IN NS ns.redes.edu.br.<br />
@ IN MX 10 mail.redes.edu.br.<br />
$ORIGIN redes.edu.br.<br />
ns IN A 10.0.6.10<br />
www IN A 10.0.9.11<br />
ssh IN A 10.0.9.10<br />
mail IN A 10.0.6.10<br />
apelido IN CNAME mail.redes.edu.br. </syntaxhighlight><br />
#*Ao terminar de editar digite <CRTL> + X, em seguida, Y e <Enter>.<br />
#*Este arquivo definirá o banco de dados do DNS.<br />
# Reinicie o serviço DNS: <syntaxhighlight lang=bash> /etc/init.d/bind9 restart </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça um teste com consulta ao seu servidor com o comando, por exemplo: </span><syntaxhighlight lang=bash> dig @localhost www.redes.edu.br </syntaxhighlight><br />
#*O resultado obtido deve conter algo do tipo:<syntaxhighlight lang=bash><br />
;; ANSWER SECTION:<br />
www.redes.edu.br. 86400 IN A 10.0.9.11 </syntaxhighlight><br />
<br />
===Configurando as máquinas para acessarem o DNS===<br />
<br />
# Em qualquer máquina que desejar navegar por nomes, declare o servidor '''DNS_Server''' como '''servidor DNS''' com o seguinte comendo digitado no respectivo terminal: <syntaxhighlight lang=bash><br />
echo nameserver 10.0.6.10 >> /etc/resolv.conf </syntaxhighlight><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Faça alguns testes simples via ping, por exemplo: </span><syntaxhighlight lang=bash><br />
ping www.redes.edu.br<br />
ping apelido.redes.edu.br </syntaxhighlight><br />
# Acrescente um novo endereço ao banco de dados: '''casa.redes.edu.br''' apontando para o IP '''10.0.8.21'''.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Prove que o mesmo está funcional, por exemplo, dando um ping casa.redes.edu.br a partir do host ssh.</span><br />
# No terminal do '''DNS_Server''' execute: <syntaxhighlight lang=bash><br />
dig apelido.redes.edu.br </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual foi o resultado obtido?</span><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o significado?</span><br />
<br />
==Servidor WEB==<br />
<br />
# Preparando uma página HTML para colocar no servidor WEB.<br />
#* Páginas da internet são construídas usando o formato HTML.<br />
#* Ver aqui o que é uma página [https://wiki.sj.ifsc.edu.br/images/e/ee/03_-_HTML.pdf HTML] e como construir uma página simples.<br />
## No terminal da máquina '''WEB SERVER''' entre no diretório diretório''' /var/www/html''': <syntaxhighlight lang=bash><br />
cd /var/www/html </syntaxhighlight><br />
## Use o editor nano para editar uma página chamada '''index.html''': <syntaxhighlight lang=bash><br />
nano index.html </syntaxhighlight><br />
##* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print com o editor aberto.</span><br />
## Crie a página com o seguinte conteúdo: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Pagina teste do aluno Pedro Alvares Cabral da Silva</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
##* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
## Inicie o SERVIÇO WEB para testar o protocolo HTTP. O servidor WEB irá disponibilizar a página criada para acesso remoto via protocolo HTTP: <syntaxhighlight lang=bash><br />
/etc/init.d/lighttpd start </syntaxhighlight><br />
# No '''router2''' deixe o Wireshark capturando pacotes.<br />
# Faça um acesso a sua página, a partir do Firefox (cliente HTTP) em um PC cliente de sua escolha: <syntaxhighlight lang=bash>Clique com o botão direito do mouse sobre, por exemplo, o pc1<br />
Clique sobre Web Browser<br />
Digite no navegador: www.redes.edu.br</syntaxhighlight><br />
#* Se der erro, verifique se a máquina da qual você está navegando está resolvendo nomes, por exemplo, no terminal fazendo um ping www.redes.edu.br. <br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# Se desejar modificar a página repita os itens 2 e 3.<br />
# Crie uma nova página dentro do diretório /var/www/html:<syntaxhighlight lang=bash><br />
nano abacaxi.html </syntaxhighlight><br />
# Coloque um conteúdo a seu critério: <syntaxhighlight lang=c><br />
<html><br />
<body><br />
<h1>Redes de Computadores</h1><br />
<p>Minha primeira pagina..........</p><br />
</body><br />
</html><br />
</syntaxhighlight><br />
#* Ao terminar de editar digite '''<Ctrl> + <X>''' e, em seguida, '''Y''' e '''<Enter>'''.<br />
# Acesse a nova página através do navegador Firefox com o endereço (URL): <syntaxhighlight lang=bash>http://www.redes.edu.br/abacaxi.html </syntaxhighlight><br />
#* <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">RECORTE a tela com a página em destaque no navegador e cole no relatório.</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve um print da tela do Wireshark destacando a troca de mensagens HTTP e o conteúdo HTML de uma das páginas acessadas.</span><br />
# Extra (não obrigatório). Para quem quiser enfeitar sua página html com, por exemplo, imagem, siga o roteiro:<br />
## Baixe a imagem desejada na máquina real, por exemplo, imagem.jpg.<br />
## Abra um terminal da máquina real e, no diretório onde se encontra imagem.jpg, digite:<syntaxhighlight lang=bash><br />
sudo hcp imagem.jpg web:/var/www/html</syntaxhighlight><br />
## Confira no terminal do WEB SERVER (Imunes) se a imagem está lá:<syntaxhighlight lang=bash><br />
cd /var/www/html<br />
ls -l</syntaxhighlight><br />
## Use a imagem em sua página.<br />
<br />
=Comparando ''sockets'' UDP e TCP=<br />
<br />
==Objetivos==<br />
*Entender o conceito de ''sockets'' relacionados aos protocolos UDP e TCP.<br />
**Processos que rodam em máquinas diferentes se comunicam entre si enviando mensagens para ''sockets''. Um processo é semelhante a um prédio e o ''socket'' do processo é semelhante a uma porta em seu interior. A aplicação reside dentro do prédio e o protocolo da camada de transporte reside no mundo externo. Um programador de aplicação controla o interior do prédio mas tem pouco (ou nenhum) controle sobre o exterior.<br />
*Simultaneamente explora-se os conceitos relativos aos protocolos UDP e TCP, observando-se a quantidade de mensagens necessárias para a troca de uma simples frase textual.<br />
**'''Observa-se a "agilidade" do UDP e a robustez do TCP'''.<br />
*Por fim, propõe-se um comparativo entre os dois protocolos da camada de transporte: UDP e TCP.<br />
<br />
<br />
Leia os slides de 1 à 12 e o 58: [http://docente.ifsc.edu.br/odilson/RED29004/PPTs%20-%20Cap%C3%ADtulo%203%20Camada%20de%20transporte.pdf Capitulo 3 -- Camada de Transporte]<br />
<br />
==Descrição da aplicação a ser desenvolvida em UDP e TCP==<br />
<br />
*Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de ''socket'':<br />
#Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.<br />
#O servidor recebe os dados e converte os caracteres para maiúsculas.<br />
#O servidor envia os dados modificados ao cliente.<br />
#O cliente recebe os dados modificados e apresenta a linha em sua tela.<br />
<br />
==Programação de ''sockets'' com TCP==<br />
*Diferentemente do UDP, o TCP é um protocolo orientado a conexão. Pode-se dizer que o TCP é realizado em duas etapas:<br />
#Primeiramente eles devem se apresentar, o primeiro ''socket'' da Figura abaixo. Isto serve somente para abertura de conexão.<br />
#Estabelecer uma conexão TCP, o segundo ''socket'' da Figura abaixo. Todos os dados trafegarão pelo segundo ''socket''.<br />
<br />
O processo TCPServer tem dois sockets:<br />
<br />
[[imagem:Programacao_socket_TCP_1.png|400px]]<br />
<br />
A aplicação cliente-servidor usando TCP:<br />
<br />
[[imagem:Programacao_socket_TCP_2.png|500px]]<br />
<br />
===Roteiro===<br />
*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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
#Escreva (copie) o código do programa '''servidor''' e salve como TCPServer.py <syntaxhighlight lang=bash><br />
from socket import *<br />
serverPort = 33333<br />
serverSocket = socket(AF_INET, SOCK_STREAM)<br />
serverSocket.bind(('',serverPort))<br />
#Escuta as requisicoes do TCP do cliente. Numero maximo de conexoes em fila = 1<br />
serverSocket.listen(1)<br />
print ('O servidor esta pronto')<br />
while 1:<br />
#Quando o cliente bate a essa porta, o programa chama o metodo accept() para serverSocket,<br />
#que cria um novo socket no servidor, chamado connectionSocket, dedicado a esse cliente<br />
#especifico. Cliente e servidor, entao, completam a apresentacaoo, criando uma conexao TCP<br />
#entre o clientSocket do cliente e o connectionSocket do servidor.<br />
connectionSocket, addr = serverSocket.accept()<br />
message = connectionSocket.recv(1024)<br />
print (message)<br />
messageMaiuscula = message.upper()<br />
connectionSocket.send(messageMaiuscula)<br />
connectionSocket.close() </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 TCPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o código do programa '''cliente''' e salve como TCPClient.py.<br />
#*<span style="color: red;">Lembre-se de ajustar ip_do_servidor para o número adequado, ou seja, o IP da máquina onde está rodando o TCPServer.py. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
from socket import *<br />
serverName = 'ip_do_servidor'<br />
serverPort = 33333<br />
#SOCK_STREAM habilita uso do TCP<br />
clientSocket = socket(AF_INET, SOCK_STREAM)<br />
#Representa o estabelecimento da conexao. É o "aperto de maos", onde o cliente e servidor trocam<br />
#informacoes da portas que serao utilizadas pela conexao (socket) propriamente dito<br />
clientSocket.connect((serverName,serverPort))<br />
message = input('Entre com a sentenca em minúsculas: ')<br />
#Diferentemente do UDP, aqui não é necessário encaminhar o endereço do servidor, já que este socket<br />
#é uma "tubulação" direta entre ambos, basta empurrar dados<br />
clientSocket.send(bytes(message, 'utf-8'))<br />
modifiedMessage = clientSocket.recv(1024)<br />
print('Mensagem do servidor: ', modifiedMessage.decode('utf-8'))<br />
clientSocket.close() </syntaxhighlight><br />
#Execute o WireShark. Configure a captura na interface '''''any''''', use o filtro do tipo: '''tcp.port==33333'''.<br />
#Em um novo terminal execute o programa cliente: <syntaxhighlight lang=bash><br />
python3 TCPClient.py </syntaxhighlight><br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local'</syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou o socket aberto?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais parâmetros apresentados?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você vê a porta 33333 tanto no Local Address quanto no Peer Address, por quê?<br />
#Em um terceiro terminal, execute outro programa cliente.<br />
#Verifique os sockets TCP ativos:<syntaxhighlight lang=bash><br />
ss -nta | grep -E '33333|Local' </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Você encontrou 2/4 sockets abertos? Como eles estão definidos?<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark. Observe se recebeu o retorno das mensagens em maíuscula.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
##Para cada cliente, as três primeiras mensagens trocadas apresentam a camada de aplicação, sim ou não? Explique. O que elas significam?<br />
##Encontre a frase/palavra escrita enviada ao servidor (minuscula) e a resposta em maíuscula?<br />
##Qual o tamanho, dos pacotes contendo as mensagens: i) ''Data'' (camada 5), ii) ''Header Length'' (camada 4), iii) ''Total Length'' (camada 3). Qual a relação entre estes valores?<br />
##As última 3 mensagens contém o fechamento de conexão, explique-as.<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão TCP estabelecida (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Quais são os números de porta e os IPs utilizados?<br />
##Quais foram os números de sequência utilizados em todas as mensagens?<br />
##Qual o número identificador de protocolo TCP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
<br />
==Programação de ''sockets'' com UDP==<br />
<br />
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 [[RED29004-2014-1#03.2F04.2F14:_Camada_de_Aplica.C3.A7.C3.A3o:_programando_sockets_TCP | aqui]].<br />
<br />
[[imagem:Programacao_socket_UDP.png|500px]]<br />
<br />
Como fica evidente na Figura acima, há dois processos cliente e servidor que podem ou não rodar em máquinas distintas e se comunicam justamente enviando mensagens via ''sockets'', que abstrai qualquer necessidade de conhecimento das camadas subjacentes.<br />
<br />
===Roteiro===<br />
*Observe que uma mesma máquina pode fazer o papel de cliente e servidor simultaneamente.<br />
#Escreva (copie) o programa UDPServer.py <syntaxhighlight lang=bash><br />
#Os comentarios estao propositalmente sem acentuacao, caso contrario, tem-se erro de sintaxe.<br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define explicitamente a porta aberta servidor<br />
serverPort = 22222<br />
#Cria o socket do servidor, denominado serverSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, ou seja, eh um socket UDP.<br />
serverSocket = socket(AF_INET, SOCK_DGRAM)<br />
#Vincula o numero da porta, nesse caso 22222, ao socket do servidor e "abre a porta".<br />
serverSocket.bind(('', serverPort))<br />
print ('O servidor esta pronto para recepcao')<br />
#Aguarda indefinidamente por contatos (mensagens) de clientes<br />
while 1:<br />
message, clientAddress = serverSocket.recvfrom(2048)<br />
print (message)<br />
#Ao receber a mensagem do cliente converte todos os caracteres para maiusculas.<br />
modifiedMessage = message.upper()<br />
serverSocket.sendto(modifiedMessage, clientAddress) </syntaxhighlight><br />
#No terminal da máquina execute a aplicação servidor: <syntaxhighlight lang=bash><br />
python3 UDPServer.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe. Deixe o programa rodando nesse terminal.<br />
#Escreva (copie) o programa cliente. UDPClient.py. <span style="color: red;"><br />
#*Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP da maquina onde está rodando a aplicação servidor. Obs.: mantenha as aspas. <syntaxhighlight lang=bash><br />
#Esta linha define que pode-se utilizar sockets dentro do programa<br />
from socket import *<br />
#Define o endereco ip do servidor ao qual o cliente contactara.<br />
#Lembre-se de ajustar ip_do_servidor para o numero adequado, ou seja, o IP de sua maquina ou de seu vizinho.<br />
serverName = 'ip_do_servidor'<br />
#Define a porta de acesso ao servidor<br />
serverPort = 22222<br />
#Cria o socket do cliente, denominado clientSocket. O primeiro parametro indica a familia do endereco,<br />
#em particular, AF_INET indica que a rede subjacente esta usando IPv4. O segundo parametro indica que<br />
#o socket eh do tipo SOCK_DGRAM, o que significa que eh um socket UDP.<br />
clientSocket = socket(AF_INET, SOCK_DGRAM)<br />
#raw_input eh uma funcao interna da linguagem Python que permite a solicitacao de entrada de dados que<br />
#sera armazenada em message.<br />
message = input('Entre com a sentanca em minuculas: ')<br />
#O metodo sendto() acrescenta o endereco (e porta) de destino a mensagem e envia o pacote resultante<br />
#pelo socket aberto.<br />
clientSocket.sendto(message.encode('utf-8'),(serverName, serverPort))<br />
#Apos o envio do pacote, o cliente aguarda a resposta do servidor armazenando esta na variavel<br />
#modifiedMessage e o endereco de origem eh armazenado em serverAddress. 2048 representa o tamanho do buffer.<br />
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)<br />
#Imprime a mensagem recebida na tela.<br />
print (modifiedMessage)<br />
#Fecha o socket.<br />
clientSocket.close() </syntaxhighlight><br />
#Em outro terminal da máquina execute o programa: <syntaxhighlight lang=bash><br />
python3 UDPClient.py </syntaxhighlight><br />
#*Caso dê uma mensagem de erro, tente entende-la e corrija o problema. Com certeza é sintaxe.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique a porta aberta com o comando:<syntaxhighlight lang=bash><br />
ss -ua </syntaxhighlight><br />
#*Lembre-se que o UDP é não orientado a conexão, portanto, não é possível verificar o socket aberto, já que ele fica aberto por uma fração de segundos, somente enquanto o processo está rodando.<br />
#Rode o WireShark. Configure a captura na interface '''''any''''', com o filtro: '''udp.port == 22222'''.<br />
#No terminal da aplicação cliente digite a mensagem que desejar, SEM espaços em branco, e espere a resposta do servidor. Funcionou?<br />
#Com o servidor aberto faça duas conexões simultâneas. Pode ser dois terminais rodando a aplicação cliente.<br />
#Em cada uma das aplicações clientes digite um texto, sempre diferente para facilitar a análise no Wireshark.<br />
#Pare a captura de pacotes.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">PERGUNTAS baseadas na captura:<br />
##Em algum momento foi identificado algum procedimento para estabelecimento de conexão? <br />
##Em algum campo do UDP existe numeração de mensagens?<br />
##Qual o número identificador de protocolo UDP no pacote IP? Dica: na janela central abra o campo ''Internet Protocol'' e procure a string ''Protocol''.<br />
##Qual é o ''checksum'' no pacote (datagrama) UDP? Qual é o formato apresentado? Quantos bits ele possui?<br />
##É possível capturar toda a troca de mensagens e inclusive capturar o texto passado do cliente para o servidor?<br />
##Gere com o Wireshark um diagrama da comunicação, ou diagrama de troca de mensagens, somente da conexão UDP (não deve conter outras mensagens). Insira-o no relatório: </span><syntaxhighlight lang=bash> Statistics >> Flow Graph >> OK </syntaxhighlight><br />
##Se a mensagem digitada for '''teste''', do cliente para o servidor deve aparacer o campo '''Data:7465737465''' e a resposta do servidor deve aparecer '''Data: 5445535445'''. O que significa isso? Dica, olhe na internet o código ASCII.<br />
##Qual foi a sequência numérica do campo ''Data'' em seu teste? Qual o significado?<br />
##Qual é o protocolo da camada de transporte nessa troca de mensagens?<br />
##Qual são os dois números de porta e os dois IPs utilizados?<br />
##Quantos ''socktes'' foram abertos no servidor com um cliente "conectado"? E com dois clientes?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Comparativo entre TCP e UDP:<br />
##Quantas mensagens foram trocadas entre o servidor e o cliente em cada um dos protocolos para atingir o mesmo objetivo?<br />
##O que justifica a diferença na quantidade de mensagens trocadas?<br />
##Discuta as vantagens e desvantagens de cada protocolo.<br />
<br />
==Desafios extras==<br />
<br />
#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.<br />
<br />
= TCP x UDP=<br />
<br />
==Objetivos==<br />
*O objetivo desses experimentos é evidenciar as diferenças entre os protocolos TCP e UDP.<br />
*Ambos protocolos de transporte podem ser usados por aplicações que precisem se comunicar. Porém cada um deles têm certas propriedades, então a escolha precisa ser realizada baseada nas necessidade de comunicação a ser feita pela aplicação.<br />
<br />
== Roteiro ==<br />
<br />
'''O que aconteceria se um arquivo fosse transferido de um computador a outro com ambos protocolos?'''<br />
<br />
O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCPxUDP.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/seq_num.txt</syntaxhighlight><br />
#Observe o tamanho do arquivo auxiliar transferido, seq_num.txt, ele deve ter exatamente 5327160 bytes (cerca de 5,1 MB). Você pode fazer isso com o comando '''ls -l'''.<br />
===Transferência utilizando o protocolo '''TCP'''===<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
#* Observe que abaixo do enlace está escrito ber=1000000. BER é bit error rate, ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/1000000. Isso significa que, em média, a cada 1 milhão de bits que passar pelo canal, 1 bit será perdido/adulterado.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) (utilize '''man nc''' para saber os detalhes das ''flags'' utilizadas) que abrirá um ''socket'' '''TCP''' que ficará aguardando conexão na porta 5555. Os dados recebidos serão salvos (através do direcionamento feito através do símbolo '''>''') em '''arquivoTCP''': <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 > arquivoTCP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente 2 minutos a transmissão será finalizada.<br />
#Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo TCP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais as portas origem e destino escolhidas pelo cliente e servidor?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último pacote?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o número de sequência do primeiro e do último ACK?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Calcule e mostre o procedimento de cálculo do tamanho do arquivo pela análise dos pacotes? Qual é a maneira mais fácil? Apresente os cálculos ou descreva a maneira de obtenção do valor. Dica: observe o primeiro e o último número de sequência e faça uma correlação com o tamanho do arquivo.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o tamanho do último segmento de dados recebido? Perceba que ele é diferente dos demais, que vem "cheios".</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do ''3-way handshake'' e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Apresente os segmentos do fechamento de conexão e analise os campos do cabeçalho, que os identificam. Estão de acordo com a norma apresentada na literatura (em sala de aula)?</span></span><br />
<br />
===Transferência utilizando o protocolo '''UDP'''===<br />
<span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">'''Caso não tenha fechado o Imunes na Parte 1 (Transferência utilizando o protocolo '''TCP''') vá direto para o Item 5.'''</span><br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCPxUDP.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PC com um enlace de 1000 kbps.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
#* <span style="color: blue;">Dica: para copiar textos para os terminais do Imunes, copie normalmente o texto, por exemplo, da Wiki, com o <Ctrl> + <C> e cole com <Ctrl> + <Shift> + <V> ou clicando sobre a rodinha (''scroll'') do mouse sobre o terminal desejado do Imunes.</span><br />
# Copie o arquivo '''seq_num.txt''' para a máquina '''Transmissor'''. No terminal da hospedeira ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp seq_num.txt Transmissor: </syntaxhighlight><br />
# Na máquina '''Receptor''' execute o Wireshark:<syntaxhighlight lang=bash><br />
Clique sobre o ícone da máquina Receptor com o botão direito do mouse >> Wireshark >> eth0... </syntaxhighlight><br />
# Crie um filtro para monitorar somente o tráfego desejado: <syntaxhighlight lang=bash><br />
ip.addr==10.0.0.20 and udp</syntaxhighlight><br />
# Na máquina '''Receptor''' execute o '''netcat''' ([http://netcat.sourceforge.net/ nc]) que abrirá um ''socket'' '''UDP''' que ficará aguardando segmentos na porta 6666. Os dados recebidos serão salvos em '''arquivoUDP''': <syntaxhighlight lang=bash><br />
nc -vvnlu -p 6666 > arquivoUDP </syntaxhighlight><br />
# Na máquina '''Transmissor''' também execute o '''netcat''' mas com o objetivo de transmitir o arquivo seq_num.txt para a maquina '''Receptor''': <syntaxhighlight lang=bash><br />
nc -vvnu 10.0.0.21 6666 < seq_num.txt </syntaxhighlight><br />
# Monitore a janela do Wireshark até a parada de apresentação de pacotes. Após aproximadamente uns 30 segundos a transmissão será finalizada.<br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes e anote o tempo (''time'') apresentado na última mensagem do Wireshark. Esse é o tempo total de transmissão utilizado pelo UDP.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Verifique o arquivo recebido.</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">O tamanho é igual ao do arquivo seq_num.txt?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quanto tempo levou para transmiti-lo?</span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando a captura de pacotes do WireShark responda:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é o identificar do primeiro e do último pacote? Existe?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">É possível calcular o tamanho do arquivo pela análise dos pacotes? É mais fácil ou difícil que no caso da transferência via TCP?</span></span><br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Compare as transferências feitas com os protocolos TCP e UDP em relação, principalmente, ao tempo gasto para transmitir o arquivo e a integridade de dados.<br />
## O que eles têm em comum?<br />
## Que diferenças lhe pareceram mais pronunciadas?<br />
## Como isso deve afetar as aplicações que usam esses protocolos?</span><br />
<br />
=Desvendando o TCP - Número de Sequência, Controle de Erros, Transmissão ''Full-Duplex''=<br />
<br />
==Objetivos==<br />
<br />
*Verificar alguns mecanismos do protocolo TCP:<br />
**Controle de Erros: Significado de Número de Sequência, ACK;<br />
**Controle de Fluxo: Significado do campo Windows Size; Funcionamento do controle de fluxo;<br />
**Transmissão Full-Duplex.<br />
<br />
==Topologia de rede para experimetação==<br />
#O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
#Abra um terminal e baixe o aquivo de configuração da rede a ser utilizada e um arquivo auxiliar dos experimentos: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Num_Seq_Erro.imn <br />
wget -4 http://redes.sj.ifsc.edu.br/arq30Bytes.txt</syntaxhighlight><br />
<br />
==PARTE 1 - Transmissão sem erros: Verificação de Número de Sequência e Reconhecimentos==<br />
<br />
# Execute o Imunes.<br />
# Carregue o arquivo: <syntaxhighlight lang=bash><br />
File >> Open >> TCP_Num_Seq_Erro.imn</syntaxhighlight><br />
#* Será apresentada uma simples rede a ser utilizada no experimento, composta de 2 PCs: '''Transmissor''' e '''Receptor'''.<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">No terminal da máquina hospedeira ('''NÃO do Imunes''') digite</span>:<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20'<br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para copiar textos para o Imunes, copie normalmente o texto, por exemplo, da Wiki, com o < Ctrl > + < C > e cole com < Ctrl > + < Shift > + < V > ou clicando sobre a rodinha (''scroll'') do mouse.</span><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Pare a captura de pacotes no Wireshark.<br />
# Na tela do Wireshark você terá algo parecido com o apresentado na Figura 1. [[Arquivo:WiresharkTCPPerdaDePacotes.png |thumb | 600px| Fig.1 -- Protocolo TCP]]<br />
#* O comportamento padrão do Wireshark é redefinir o número de sequência para sempre iniciar em 0. Este comportamento pode ser alterado conforme nossas necessidades: <syntaxhighlight lang=bash><br />
Edit >> Preferences >> Protocols >> TCP >> (Habilite/Desabilite) Relative sequence numbers >> OK </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas<br />
## Qual o número de sequência normalizado pelo Wireshark de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Qual o número de sequência real de cada segmento de dados transmitido (do Transmissor para o Receptor) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado? É igual ao número de sequência ou é um número acima? Justifique.<br />
## Qual o significado, funcionalidade e necessidade das mensagens, inseridas pelo Wireshark, "TCP ZeroWindow" e "TCP Window Update"?<br />
## Qual a relação entre os campos "Len=", "Seq=", "Ack=", "Win=" e o tamanho do segmento de dados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 2 - Transmissão com erros: retransmissões==<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#* <span style="color: blue;">Dica: para abrir um terminal de uma das máquinas da rede a ser simulada basta dar um duplo clique sobre a mesma.</span><br />
# Copie o arquivo arq30Bytes.txt para a máquina '''Transmissor''' do Imunes. No terminal da máquina hospedeira ('''NÃO do Imunes''') digite::<syntaxhighlight lang=bash><br />
sudo hcp arq30Bytes.txt Transmissor: </syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Vamos provocar perda de bits no enlace editando o BER do mesmo. BER é ''bit error rate'', ou seja, foi inserido uma taxa de erro de bist no canal como sendo 1/15000. Isso significa que, em média, a cada 15 mil bits que passar pelo canal, 1 bit será perdido/adulterado.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 15000 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Execute o processo servidor no '''Receptor''' e prepare o mesmo para limitar a sua capacidade de recepção em cerca de 20 bytes (tamanho do ''buffer''). Isto permitirá ver a quebra do arquivo de 30 bytes em alguns segmentos TCP: <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='20 20 20' <br />
nc -vvnl -p 5555 > ArqRecebido.txt </syntaxhighlight><br />
# Envie o arquivo arq30Bytes.txt da máquina '''Transmissor''': <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.21 5555 < arq30Bytes.txt </syntaxhighlight><br />
#* Obs: Caso receba uma mensagem "No route to host", repita o comando acima. O problema é gerado por perdas sucessivas de mensagens de estabelecimento de conexão do TCP, devido à perda de dados estabelecida.<br />
# Monitore o Wireshark e, quando perceber a finalização da transmissão dos 30 bytes, pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## Qual o número de sequência (normalizado pelo Wireshark) de cada segmento de dados transmitido (de PC1 para PC2) e qual o significado do número de reconhecimento em cada um deles?<br />
## Como foi reconhecido cada segmento enviado?<br />
## Houve perda de pacotes? Como você identificou isso?<br />
## Os pacotes perdidos foram retransmitidos? Justifique.<br />
## Qual o significado da mensagem, inserida pelo Wireshark, "TCP Retransmission"? Como você justificaria uma perda de segmento sem acesso a essa informação?<br />
## Qual o significado das cores diferenciadas, inseridas pelo Wireshark, nos diversos segmentos apresentados?</span><br />
#Pare o experimento no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight></span><br />
<br />
==PARTE 3 - Testando a capacidade do TCP de enviar dados de forma duplex==<br />
<br />
* Agora vamos fazer um pequeno teste de transmissão de arquivos entre dois colegas e observar o comportamento ''full-duplex''.<br />
* No experimento, o arquivo de uma máquina será transmitido para outra e vice-versa.<br />
<br />
# Inicie a simulação da rede no Imunes:<syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
# Vamos zerar perda de bits no enlace editando o BER do mesmo.<syntaxhighlight lang=bash><br />
Duplo clique sobre o enlace (fio vermelho) >> acrescente o valor 0 no campo BER >> Clique em ''Apply'' </syntaxhighlight><br />
# Num terminal da máquina do hospedeira/Linux ('''Não do Imunes''') baixe os arquivos para o experimento e salve-os a pasta pessoal de seu usuário: <syntaxhighlight lang=bash><br />
cd ~<br />
wget -4 http://redes.sj.ifsc.edu.br/Servidor.tx -O Servidor.tx<br />
wget -4 http://redes.sj.ifsc.edu.br/Cliente.tx -O Cliente.tx </syntaxhighlight><br />
# Copie os arquivos para as máquinas do Imunes. No terminal da máquina hospedeira/Linux ('''NÃO do Imunes''') digite:<syntaxhighlight lang=bash><br />
sudo hcp Servidor.tx Transmissor: <br />
sudo hcp Cliente.tx Receptor:</syntaxhighlight><br />
# Execute o Wireshark no '''Receptor''':<syntaxhighlight lang=bash><br />
Clique direito do mouse sobre o ícone do Receptor >> Wireshark >> eth0.. </syntaxhighlight><br />
# Limite o tamanho do ''buffer'' do TCP tanto no '''Transmissor''' quanto '''Receptor''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
# No '''Transmissor''', que fará o papel de servidor por aguardar a conexão do cliente, execute o comando abaixo. Perceba que o Servidor vai enviar (o sinal '''<''' indica isso) um arquivo e vai receber e salvar (o sinal '''>''' indica isso) outro do Cliente. <syntaxhighlight lang=bash><br />
nc -vvnl -p 5555 < Servidor.tx > Arq_recebido.rx </syntaxhighlight><br />
# No '''Receptor''', que fará o papel de cliente, execute o comando abaixo. Perceba que ele também vai enviar e receber arquivo do servidor. <syntaxhighlight lang=bash><br />
nc -vvn 10.0.0.20 5555 < Cliente.tx > Arq_recebido.rx </syntaxhighlight><br />
# Pare os processos rodando nos terminais do '''Transmissor''' e '''Receptor''' com:<syntaxhighlight lang=bash><br />
Ctrl + c </syntaxhighlight><br />
# Confira o conteúdo dos arquivos recebidos no '''Transmissor''' e '''Receptor''': <syntaxhighlight lang=bash><br />
cat Arq_recebido.rx </syntaxhighlight><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Os arquivos foram corretamente trocados entre as duas máquinas? Dica: Responda observando o conteúdo dos arquivos, que são exclusivos e bem criativos :).</span><br />
# Pare a captura de pacotes no Wireshark.<br />
# Adicione o filtro '''tcp''' ao Wireshark, para limpar os dados apresentados.<br />
# Analise como os dados foram transmitidos e reconhecidos.<br />
# <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Perguntas:<br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Onde pode ser observado a comunicação ''full-duplex''? Obs.: Foque a análise nos segmentos que contém [PSH, ACK].</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual é a relação entre os comandos no terminal tanto do cliente como do servidor com a comunicação ''full-duplex''?</span><br />
## <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como os ACKs são propagados, em pacotes exclusivos ou de carona (''piggyback'') com os dados?</span></span><br />
<br />
=TCP: Controle de congestionamento e equidade=<br />
<br />
== Objetivos ==<br />
*Visualização, através de gráficos, do '''controle de congestionamento''' e a consequente '''equidade''' do protocolo TCP.<br />
*Visualização, através de gráficos, da disputa por banda entre os protocolos TCP e UDP.<br />
*Utilização do software [https://iperf.fr/ Iperf] (iperf –h para help) para gerar tráfego entre duas máquinas - '''cliente''' e '''servidor''' - e permitir a observação do comportamento da disputa de banda.<br />
*Utilização do software [http://imunes.net/ Imunes] para simulação de redes "complexas".<br />
<br />
==Topologia de rede para experimetação==<br />
[[Arquivo:TCP_Controle_de_Cong_e_Equidade.png |thumb | 500px| Dois clientes "disputando" o enlace com o servidor]]<br />
*O roteiro será executado sobre máquinas virtuais, através do uso do [http://imunes.net/ Imunes].<br />
*Para realização dos ensaios será montada a rede virtual apresentada na Figura.<br />
*Observe que na figura todos os enlaces são iguais e limitados a 1 Mbps com ''delay'' de 5 us.<br />
*Os dois clientes vão disputar o enlace único entre o roteador e servidor.<br />
<br />
==Parte 1: Somente fluxos TCP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/TCP_Controle_de_congestionamento_e_equidade.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/TCP_Controle_de_congestionamento_e_equidade.imn</syntaxhighlight><br />
#*Perceba que será apresentada uma rede com um roteador, dois clientes e um servidor de rede. Todos interligados por enlaces de 1 Mbps.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP tanto no '''Servidor''' quanto no '''Cliente1''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#No '''Cliente1''' execute (copie a três linhas e cole no terminal adequado e em seguida tecle <Enter>): <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2000 & \<br />
(sleep 5 && iperf -c 10.0.2.10 -f m -i 1 -t 40 -p 2001) & \<br />
(sleep 10 && iperf -c 10.0.2.10 -f m -i 1 -t 20 -p 2002) & </syntaxhighlight><br />
#Fique monitorando o '''Cliente1''' até a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura 2: [[Arquivo:TCP_Controle_de_Cong_e_Equidade_Graficos.png |thumb | 400px| Captura de 3 fluxos de dados]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
##* Duplo clique sobre o campo '''Graph name''': Porta 2000<br />
##* Duplo clique sobre o campo '''Display Filter''': tcp.port==2000<br />
##* Duplo clique sobre o campo '''Color''': clique no botão logo a direita e selecione a cor desejada.<br />
##Para os demais gráficos copie o anterior clicando no ícone com dois retângulos no canto inferior esquerdo<br />
##* Edite nome, porta e cor.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve esse gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Explique os filtros aplicados no gráfico do Wireshark.<br />
##*Quais são os 4 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##Por que a curva vermelha se sobrepõe a curva preta nos primeiros 5 segundos, a partir do início da transmissão?<br />
##Qual é a relação entre a curva preta e as curvas vermelha e verde no intervalo entre 6 e 10 segundos, a partir do início da transmissão?<br />
##Explique a relação entre as 4 curvas e o comando do cliente no intervalo entre 10 e 30 segundos, a partir do início da transmissão.<br />
##Qual é o mecanismo do TCP que explica a grande oscilação das curvas, principalmente percebida no intervalo entre 10 e 30 segundos, a partir do início da transmissão?<br />
#Pare a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Terminate </syntaxhighlight><br />
<br />
==Parte 2: Fluxos TCP mais UDP==<br />
Agora vamos dificultar a vida do TCP incluindo um tráfego UDP. O gráfico gerado deverá apresentar a competição pelo meio de transmissão entre os diversos fluxos de dados.<br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Limite o tamanho do ''buffer'' do TCP no '''Servidor''', '''Cliente1''' e '''Cliente2''': <syntaxhighlight lang=bash><br />
sysctl -w net.ipv4.tcp_rmem='10000 10000 10000' </syntaxhighlight><br />
#*Para copiar comando para os terminais das máquinas virtuais: copie o texto desejado, selecione o terminal da máquina desejada (duplo clique sobre a mesma) e clique sobre a "rodinha" do mouse que o texto será colado.<br />
#No '''Servidor''' execute: <syntaxhighlight lang=bash><br />
iperf -s -u -p 2000 & iperf -s -p 2001 & iperf -s -p 2002 & </syntaxhighlight><br />
#No '''Roteador''' execute o Wireshark: <syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o Roteador >> Wireshark >> eth2...</syntaxhighlight><br />
#A próxima etapa deve ser executada "simultaneamente" nos '''Cliente1''' e '''Cliente2'''.<br />
##Para isso copie o texto abaixo e cole no terminal do '''Cliente1''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
sleep 5 && iperf -u -c 10.0.2.10 -f m -i 1 -t 25 -p 2000 -b 10000000 </syntaxhighlight><br />
##Copie o texto abaixo e cole no terminal do '''Cliente2''', ainda NÃO tecle <Enter>: <syntaxhighlight lang=bash><br />
iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2001 & iperf -c 10.0.2.10 -f m -i 1 -t 50 -p 2002</syntaxhighlight><br />
##Tecle <Enter> no '''Cliente2''' e '''Cliente1''', NESSA ORDEM, "simultaneamente".<br />
#Fique monitorando o '''Cliente2''' a tela parar de ser atualizada, aproximadamente 50 s.<br />
#Pare os processos no '''Cliente1''', '''Cliente2''' e '''Servidor''' utilizando CTRL-C.<br />
#Pare a captura de dados no Wireshark.<br />
#No wireshark acesse '''Statistics''' >> '''IO Graph''' e, na tela que abrir, ajuste TODOS os parâmetros para obter um gráfico similar ao apresentado na Figura: [[Arquivo:TCPsxUDP.png |thumb | 400px| Captura de 2 fluxos de dados TCP mais um fluxo UDP]]<br />
##Clique em '''Add a new graph''' (sinal de + no canto inferior esquerdo)<br />
##* X Enabled<br />
#*No '''Graph 2''' altere o filtro para '''tcp.analysis.flags'''.<br />
#*No '''Graph 3''' altere o filtro para '''udp.port==2000'''.<br />
#*No '''Graph 4''' altere o filtro para '''tcp.port==2001'''. <br />
#*No '''Graph 5''' altere o filtro para '''tcp.port==2002'''.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Salve o gráfico no relatório.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Responda:<br />
##Explique detalhadamente o significado de cada parâmetro dos comandos acima, tanto do cliente quanto do servidor.<br />
##Qual a relação dos filtros aplicados no gráfico e os comandos executados no terminal.<br />
##*Quais são os 5 gráficos apresentados?<br />
##*Há uma relação de valor entre as curvas?<br />
##*Qual é esta relação?<br />
##O que ocorreu com os fluxos TCP após a entrada do fluxo UDP?<br />
##Em que momento houve erros no TCP? Qual é a relação desse momento com o UDP?<br />
##O que ocorreu com os fluxos TCP após o término do fluxo UDP?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Como desafio, compare o comportamento dos vários fluxos de dados, nos segundo experimentos, acrescentando mais fluxos UDP e TCP.<br />
<br />
=Interligação de duas redes através de um roteador=<br />
==Objetivos==<br />
<br />
#Introdução ao mundo IP<br />
#Verificação das configurações de interfaces de rede<br />
#Verificação de tabelas de roteamento nos hospedeiros e no roteador<br />
#Verificação de movimentação de pacotes (rotas) em roteadores<br />
<br />
===Referências===<br />
*[http://docente.ifsc.edu.br/odilson/RED29004/MACxIP.pdf Endereçamento MAC x Endereçamento IP]<br />
*[http://linux-ip.net/html Guia de Administração da Camada IP no Linux]<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:2_sub-redes_com_1_roteador.png|500px]]<br />
<br />
==Procedimento==<br />
<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/Roteador_com_duas_redes.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/Roteador_com_duas_redes.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore (''dismiss'') a mensagem de erro apresentada. O erro é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc1''' - '''pc4'''), 1 roteador ('''router1''') e 2 switchs. O roteador possui duas interfaces de rede, com seus respectivos IPs - camada 3, que interliga as duas sub-redes. Cada ''switch'' tem 3 interfaces, mas sem IPs, camada 2.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anotar os endereços de hardware (ou MAC) e IP de cada dispositivo na rede. No terminal de cada PC execute: <syntaxhighlight lang=bash><br />
ifconfig </syntaxhighlight> ou <syntaxhighlight lang=bash><br />
ip a </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, interpretar e anotar a tabela de roteamento em todos os hospedeiros '''pc1''' - '''pc4''' e no roteador '''router1'''. Identificar os ''default gateways'' em cada PC.<syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo do '''pc1''' para '''pc2''' são enviados diretamente para '''pc2''', ou seja, entrega direta. Explique a entrega direta.<br />
##Deixe o ping entre '''pc1''' e '''pc2''' executando no '''pc1''':<syntaxhighlight lang=bash><br />
ping 10.0.0.21</syntaxhighlight><br />
##No '''router1''' capture pacotes com o Wireshark na interface eth0:<syntaxhighlight lang=bash><br />
Clique com o botão direito do mouse sobre o router1 >> Wireshark >> eth0... </syntaxhighlight><br />
##Observe que não há tráfego de pacotes no '''router1''', portanto, entrega direta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Observar, "provar" e anotar que pacotes indo de '''pc1''' para '''pc4''' são encaminhados ao roteador e, em seguida, entregues ao destino, ou seja, entrega indireta.<span style="color: black;"><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique a entrega indireta.<span style="color: black;"><br />
<br />
==Configuração básica de interface de rede==<br />
#No '''pc3''' teste a conectividade com os demais '''PCs''', por exemplo, fazendo ''pings'' para o '''pc1''' e '''pc4''': <syntaxhighlight lang=bash><br />
ping 10.0.0.20 <br />
ping 10.0.1.21</syntaxhighlight><br />
#*Perceba que não há conectividade, não há resposta aos ''pings'', dado que a interface de rede do '''pc3''' não está devidamente configurada.<br />
#Assim sendo, configure a interface de rede no '''pc3'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote todos os comandos executados.<br />
##Inicie configurando o IP com o comando '''ifconfig''' (man ifconfig) ou '''ip a''' (man ip). Dica: Observe a configuração de rede do '''pc4''', que está na mesma sub-rede, e tente adaptá-la para o '''pc3'''.<br />
##*Assim que a configuração do IP for bem sucedida o ping para o '''pc4''' deverá funcionar.<br />
##Tente "pingar" para o '''pc1'''. Ainda não haverá sucesso, pois não há um roteador devidamente configurado no '''pc3'''.<br />
##Configure o roteador no pc3 com o comando '''route''' (man route).<br />
##*Assim que a configuração do roteador for bem sucedida o ping para o '''pc1''', e qualquer outro PC da rede, deverá funcionar.<br />
#*O mesmo deverá ser capaz de "pingar" para qualquer outro PC ou ser "pingado".<br />
#Execute o comando ping do '''pc3''' para o '''pc4'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc3''' para o '''pc1'''. Obteve sucesso? Se não corrija as configurações.<br />
#Execute o comando ping do '''pc2''' para o '''pc3'''. Obteve sucesso? Se não corrija as configurações.<br />
<br />
=Tabelas Estáticas de Roteamento=<br />
<br />
==Objetivos==<br />
*Analisar o funcionamento de roteadores com tabelas estáticas de roteamento.<br />
*Verificar a entrega direta e indireta de pacotes.<br />
*Analisar ''loops'' em rede.<br />
<br />
==Topologia de rede para experimetação==<br />
Em todos os experimentos será utilizado como base a seguinte topologia de rede:<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Tabelas estáticas de roteamento==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#Testes de conectividade de enlace e configuração do ''default gateway''.<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.0.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê?<br />
##Teste a conectividade do '''pc0''' executando o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Obteve sucesso? Sim ou não e por quê? Qual foi o erro observado?<br />
##Configure o roteador padrão em todos os PCs. Adapte o comando exemplo do '''pc0''' para todos os PCs: <syntaxhighlight lang=bash> route add -net default gw 10.0.0.1 </syntaxhighlight><br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) rota padrão (''default''), que é equivalente a 0.0.0.0 iv) com o roteador (gw - ''gateway'') v) 10.0.0.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao host '''pc0''', no caso.<br />
##Teste novamente a conectividade, no '''pc0''' execute o comando: <syntaxhighlight lang=bash> ping 10.0.10.1 </syntaxhighlight> e <syntaxhighlight lang=bash> ping 10.0.10.2 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? O comportamento foi o mesmo das tentativas anteriores? Sim ou não e por quê? Qual foi o erro observado?<br />
##Com os ping do item anterior ativos (um a cada tempo) rode o '''Wireshark''' no '''R0''' (clique com o botào direito do mouse sobre o '''R0''' e em seguida no menu '''wireshark eth0''').<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a origem e destino dos pacotes? Explique?<br />
###<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual a diferença no ping entre os dois itens?<br />
#Iniciando o roteamento.<br />
##Deixe o '''ping''' do do '''pc0''' para o '''R1''' e o '''wireshark - eth0''' no '''R0''' rodando e estabeleça uma rota no roteador '''R1''' com o comando: <syntaxhighlight lang=bash> route add -net 10.0.0.0/24 gw 10.0.10.1 </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> O que ocorreu com o '''ping''' e o '''wireshark'''? Por quê?<br />
##*Com este comando estamos: i) adicionando (''add'') uma rota ii) do tipo rede (''net'') iii) para a rede 10.0.0.0/24 iv) com o roteador (gw - ''gateway'') v) 10.0.10.1 que identifica a interface do roteador, '''R0''', diretamente conectado ao roteador '''R1'''.<br />
##Em todos os roteadores crie rotas para todas as redes. Em cada roteador deve-se criar 3 rotas, para as sub-redes "distantes", não diretamente conectadas. Lembre-se que os enlaces diretos já criam automaticamente rotas para as respectivas sub-redes diretamente conectadas ao equipamento, ou seja, entrega direta. Se tudo estiver correto, '''todos''' os PCs e roteadores devem pingar entre si.<br />
##*Crie rotas sempre pelo caminho mais curto, por exemplo, do '''R0''' para a rede do '''pc1''' e '''pc2''' passando por '''R1''' e para '''R2''' respectivamente.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Trace e anote as rotas entre os ''hosts'' através do '''traceroute'''.<br />
#Testando a queda de enlace.<br />
##Com todas as rotas em perfeito funcionamento, gere um '''ping''' do '''pc0''' para o '''pc2''' e execute '''wireshark eth0''' no '''R0''' , em seguida "derrube" o enlace entre o '''R0''' e '''R2'''. Por exemplo, no '''R2''' execute o comando: <syntaxhighlight lang=bash> ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight> <span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">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?<br />
<br />
==Testando campo TTL com ''loop'' na rede==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_tab_estaticas_com_loop.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_tab_estaticas_com_loop.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#Execute o Wireshark na interface '''eth1''' do '''R0''' e '''R2''' e na '''eth2''' do '''R1'''.<br />
#Gere um tráfego único a partir do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
ping -c1 10.0.2.20 </syntaxhighlight><br />
#Pare a captura em todos os Wiresharks.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual mensagem de erro foi recebida no terminal do '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Analisando as capturas dos Wireshark responda:<br />
##Aproximadamente em qual roteador o pacote foi descartado? Procure pelo menor valor de '''ttl'''.<br />
##Qual o significado da linha com o seguinte conteúdo parcial: ''Time-to-live exceeded (Time to live exceeded in transit)''?<br />
##Explique qual o objetivo do campo ttl no cabeçalho IP?<br />
<br />
=Protocolos de roteamento dinâmicos - RIP e OSPF=<br />
==Objetivo==<br />
#Analisar o funcionamento dos protocolos dinâmicos de roteamento RIP e OSPF.<br />
##No funcionamento normal.<br />
##Na queda de um enlace.<br />
##Na recomposição do enlace.<br />
#Comparar o desempenho de ambos os protocolos.<br />
<br />
==Topologia de rede para experimetação==<br />
<br />
[[Arquivo:3_roteadores_tab_estaticas.png| 500 px]]<br />
<br />
==Parte 1 - RIP==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_RIP.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_RIP.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo RIP.<br />
#Teste a funcionalidade da rede, por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight> <br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Interprete as tabelas de roteamento, diferenciando entrega direta e indireta.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Sobre o diagrama da rede, trace, através de setas, todas as rotas dos pacotes na rede ("mapa de roteamento").<br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wireshark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum demorar até uns 2-3 minutos.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o tempo aproximado para reativação das repostas do ping?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote novamente as tabelas de roteamento de todos os roteadores: <syntaxhighlight lang=bash><br />
route </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Refaça o mapa de roteamento.<br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em algum momento o ping deixou de funcionar?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Aguarde por volta de uns 2 minutos e anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Identifique e aponte as diferenças entre as rotas com e sem a queda de enlace. Obs: estão relacionados com a interface desativada.<br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro rip, para limpar a visualização.<br />
#*Clique sobre a mensagem e expanda o campo ''Routing Information Protocol'' na janela central, será possível visualizar mensagens do tipo ''IP Address: 10.0.12.0, Metric: 16''<br />
#*Os roteadores são identificados por seus IPs.<br />
#*O campo ''Metric'' indica o número de saltos do roteador em questão até a rede destino.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Tente compreender as mensagens RIPv2 trocadas desde o início explicando-as.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Justifique/explique o valor das métricas (1, 2, 3, ..., 16).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o intervalo aproximado na troca de mensagens?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Qual o número (No.) da mensagem onde a rede apresentou problemas com rotas (obs: retire o filtro rip e procure no número de sequência dos pings (seq) os números anotados no item 15.1).<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Quais e quantas mensagens (número) são trocadas entre os roteadores para restabelecer as rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Pesquise o significado do endereço 224.0.0.9.<br />
<br />
==Parte 2 - OSPF==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/3_roteadores_OSPF.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/3_roteadores_OSPF.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Observe que a rede é composta de 3 PCs ('''pc0''' - '''pc2''') e 3 roteadores roteador ('''R0''' - '''R2''').<br />
#*A rede será iniciada plenamente funcional, com os roteadores configurados para rodarem o protocolo OSPF.<br />
#Teste a funcionalidade da rede (pode ocorrer um atraso inicial na formação da rotas), por exemplo, no '''pc0''' execute o comando: <syntaxhighlight lang=bash><br />
ping 10.0.2.20 </syntaxhighlight><br />
#*Se o ''ping'' não funcionar imediatamente aguarde até obter respostas, o protocolo está em ação para determinar as melhores rotas.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote as rotas do '''pc0''' para o '''pc1''' e '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.1.20<br />
traceroute 10.0.2.20 </syntaxhighlight><br />
#Vamos provocar a queda de um enlace, em seguida restabelecer e analisar todo o processo.<br />
##Deixe um ping entre o '''pc0''' e '''pc2''' rodando.<br />
##Deixe o Wirezhark rodando na interface eth2 do '''R2'''.<br />
##Desative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 down </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 down </syntaxhighlight><br />
##Monitorando o ping, aguarde até o retorno das repostas ao mesmo. É comum praticamente não percebermos falhas.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Anote o número de sequência do último ping com sucesso antes da "derrubada" do enlace e o primeiro após a retorno da funcionamento normal do ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Anote novamente a rota do '''pc0''' para o '''pc2''': <syntaxhighlight lang=bash><br />
traceroute 10.0.2.20 </syntaxhighlight><br />
##Reative o enlace '''R0-R2'''. No '''R2''' execute: <syntaxhighlight lang=bash><br />
ifconfig eth1 up </syntaxhighlight> ou <syntaxhighlight lang=bash> ip link set eth1 up </syntaxhighlight><br />
#A partir das mensagens do Wireshark responda:<br />
#*É possível usar o filtro ospf, para limpar a visualização.<br />
#*Perceba que com o protocolo OSPF, diferentemente do RIP, não há trocas periódicas de mensagens do protocolo de roteamento.<br />
#*Só haverá trocas quando o protocolo sentir necessidade de alguma mudança de rota, por exemplo, com a queda de um enlace.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Quais as mensagens trocadas pelo protocolo OSPF são observadas no WireShark? Observe o trecho de mensagens onde não houve respostas ao ping.<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Qual o tempo aproximado para a total recuperação das rotas?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> As mensagens trocadas pelos roteadores são distintas quando comparadas ao uso do RIP?<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Explique as mensagens "''Hello Packet''", "''LS Update''" e "''LS Acknowledge''".<br />
##<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;"> Houve diferença no tempo de atualização das rotas quando comparado ao RIP? Explique?<br />
<br />
=''Neighbor Discovery'' e roteamento estático no IPv6=<br />
Este roteiro foi baseado no material disponível no Livro - [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
Slides de [http://docente.ifsc.edu.br/odilson/RED29004/IPv6.pdf endereçamento IPv6].<br />
<br />
[http://docente.ifsc.edu.br/odilson/RED29004/enderec-v6.pdf Guia didático de endereçamento IPv6] obtido de http://ipv6.br/.<br />
<br />
==Objetivos do laboratório==<br />
*Um primeiro contato com o protocolo [https://pt.wikipedia.org/wiki/IPv6 IPv6]<br />
*Compreender o funcionando do ''Neighbor Discovery'', o equivalente ao ARP (''Address Resolution Protocol'') do IPv4, que em resumo é uma tabela contendo a relação ente IPs e MACs.<br />
*Aprender configurações básicas de interfaces IPv6 no Linux<br />
*Aprender configurações básicas de rotas IPv6<br />
<br />
===Introdução teórica===<br />
Obs.: texto copiado literalmente de: [http://ipv6.br/pagina/livro-ipv6/ Laboratório de IPv6].<br />
<br />
A '''descoberta de vizinhança''' por meio do protocolo ''Neighbor Discovery'' no<br />
IPv6 é um procedimento realizado pelos nós de uma rede para descobrir endereços físicos dos dispositivos vizinhos presentes no mesmo enlace. A função deste protocolo se assemelha à função do ARP e do RARP no IPv4.<br />
*O procedimento é iniciado quando um dispositivo tenta enviar um pacote cujo endereço físico de destino é desconhecido. O nó solicitante envia uma mensagem ''Neighbor Solicitation'' (NS) para todos os nós do enlace pertencentes ao grupo ''multicast solicited-node'' (ff02::1:ffXX:XXXX), de modo que XX:XXXX são os últimos 24 bits do endereço IPv6 em que está interessado.<br />
*É possível notar que, por uma coincidência dos últimos 24 bits, é bastante provável que apenas o nó de destino faça realmente parte deste grupo. Isto é um ''truque'' interessante do IPv6 para diminuir o tráfego deste tipo de pacote na rede.<br />
*Na mensagem NS, o endereço IPv6 a ser resolvido é informado no campo ''Target''. O campo ''Source link-layer address'' informa ao nó de destino o endereço MAC do nó de origem, poupando-o de ter que fazer o mesmo procedimento no sentido inverso.<br />
*O nó de destino, dono do IPv6 requisitado, ao receber este pacote, envia uma mensagem ''Neighbor Advertisement'' (NA) como resposta diretamente ao nó requisitante. O seu endereço físico será informado no campo ''Target link-layer address''.<br />
*A informação de mapeamento entre endereços IP e endereços físicos é armazenada em uma tabela chamada ''neighbor cache''. Nela também fica registrado o ''status'' de cada destino, informando se o mesmo é alcançável ou não.<br />
<br />
==Topologia de rede para experimetação==<br />
A figura abaixo apresenta o diagrama esquemático da rede a ser montada/analisada. Observe que todos os IPv6 ''Global Unicast'' já estão definidos na mesma, são esses IPs que utilizaremos em nosso experimento.<br />
<br />
[[Arquivo:IPv6.png| 500 px]]<br />
<br />
==Roteiro de atividades==<br />
#Baixe o arquivo de configuração da rede, no terminal digite: <syntaxhighlight lang=bash><br />
wget -4 http://redes.sj.ifsc.edu.br/IPv6.imn<br />
</syntaxhighlight><br />
#Execute o Imunes.<br />
#Carregue o arquivo de configuração: <syntaxhighlight lang=bash><br />
File >> Open >> /home/aluno/IPv6.imn</syntaxhighlight><br />
#Inicie a simulação no Imunes: <syntaxhighlight lang=bash><br />
Experiment >> Execute </syntaxhighlight><br />
#*Ignore a mensagem de erro, o mesmo é proposital.<br />
#*Observe que a rede é composta de 4 PCs ('''pc0''' - '''pc3''') e 2 roteadores ('''R0''' - '''R1''') e 1 switch.<br />
#Execute o wireshark em R1:<syntaxhighlight lang=bash><br />
clique com o botão direito do mouse sobre seu ícone >> Wireshark >> eth0... </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Vamos testar o ''Neighbor Discovery'', anote a saída do comando. A partir do '''pc2''' execute: <syntaxhighlight lang=bash><br />
ndisc6 -m fc00:2::1 eth0 </syntaxhighlight><br />
#*Esse comando descobre e retorna o ''MAC address'' da interface de rede que possui o endereço IPv6 informado. É equivalente ao protocolo ARP do IPv4.<br />
#Observe que todas as interfaces de rede já estão pré-configuradas, exceto do '''pc3'''.<br />
#Vamos adicionar o endereço IPv6 à interface de rede no '''pc3''': <syntaxhighlight lang=bash><br />
ip addr add fc00:2::21/64 dev eth0 </syntaxhighlight><br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc2''': <syntaxhighlight lang=bash><br />
ping6 fc00:2::20 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Se tudo estiver devidamente configurado, deve-se obter sucesso no ping entre o '''pc3''' e '''pc2'''. Entrega direta ou indireta?<br />
#Faça um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#No '''pc3''' 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''': <syntaxhighlight lang=bash><br />
ip addr show dev eth0 </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">No '''pc3''', liste a tabela de roteamento com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#No '''pc3''', acrescente o ''default gateway'' com o seguinte comando: <syntaxhighlight lang=bash><br />
ip -6 route add default via fc00:2::1 dev eth0 </syntaxhighlight><br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Confira novamente a tabela de roteamento do '''pc3'''.<br />
#Faça novamente um '''ping6''' entre o '''pc3''' ao '''pc0'''.<br />
#*<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Obteve sucesso? Sim ou não e por quê?<br />
#Pode-se conferir se as rotas, nos roteadores ou qualquer host, com o comando: <syntaxhighlight lang=bash><br />
ip -6 route show </syntaxhighlight><br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">A partir do computador '''pc0''' use o comando '''traceroute6''' e anote a rota para todos os demais PCs.<br />
#Pare a captura no Wireshark.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Baseado na captura de pacotes do Wireshark explique o processo de descoberta de vizinhança (''Neighbor Solicitation'' - '''NS''' e ''Neighbor Advertisement'' - '''NA'''), citando os endereços de '''multicast''' e '''link local''' utilizados. Obs.: ao final do roteiro há alguns exemplos de mensagens.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Numa mensagem do tipo ''Neighbor Solicitation'' qual é o endereço IPv6 de origem e destino? Explique/defina ambos.<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Em todos os hosts rode o comando <syntaxhighlight lang=bash> ip -6 neighbor show </syntaxhighlight><br />
##Qual é a funcionalidade desse comando?<br />
##Qual é o significado do conteúdo dessa tabela?<br />
##A tabela mostrada em cada um dos casos é compatível com o diagrama da rede montado?<br />
##Por que, por exemplo, na tabela do '''pc2''' não há uma referência explícita ao '''pc0'''?<br />
#<span style="color: rgb(0, 128, 0);" data-mce-style="color: #008000;">Explique sucintamente as diferenças na comunicação baseada em IPv4 e IPv6.<br />
<br />
*Alguns exemplos de campos visualizáveis para uma mensagem do tipo ''Neighbor Advertisement'', presentes nas camadas destacadas:<br />
#'''Source''' (camada Ethernet)<br />
#*A origem é o endereço MAC da interface do dispositivo que enviou a resposta.<br />
#'''Protocol''' (camada Ethernet)<br />
#*Indica que a mensagem utiliza IPv6.<br />
#'''Next header''' (camada IPv6)<br />
#*Indica qual é o próximo cabeçalho. Neste caso, o valor 58 (0x3a) refere-se a uma mensagem ICMPv6.<br />
#'''Source''' (camada IPv6)<br />
#*A origem é o endereço IP da interface diretamente ligada ao enlace em que a requisição foi recebida.<br />
#'''Destination''' (camada IPv6)<br />
#'''Type''' (camada ICMPv6)<br />
#*Indica que a mensagem é do tipo 136 (Neighbor Advertisement).<br />
#'''Flags''' (camada ICMPv6)<br />
#*Uma mensagem NA possui três flags:<br />
##Indica se quem está enviando é um roteador. Neste caso, o valor marcado é 0, pois não é um roteador.<br />
##Indica se a mensagem é uma resposta a um NS. Neste caso, o valor marcado é 1, pois é uma resposta.<br />
##Indica se a informação carregada na mensagem é uma atualização de endereço de algum nó da rede. Neste caso, o valor marcado é 1, pois está informando o endereço pela primeira vez.<br />
#'''Target Address''' (camada ICMPv6)<br />
#*Indica o endereço IP associado às informações das flags. Neste caso, é o próprio endereço da interface do dispositivo em questão.</div>Odilson