Upload
donguyet
View
217
Download
0
Embed Size (px)
Citation preview
EXTENSÕES DE ENDEREÇO DA
SUB-REDE E DA SUPER-REDE
Objetivos: No Capítulo 4, vimos três tipos principais de endereços IP
(Classes A, B e C)
Neste capítulo examinaremos algumas técnicas que permitem
que um site utilize um único endereço de rede IP para múltiplas
redes físicas.
Revisão: Os endereços IP são dividos em duas partes (NetID e HostID).
Isto é extremamente importante para o roteamento.
Endereços Classe A possuem 8 bits para o NetID e 24 para o
HostID. Endereços Classe B possuem 16 bits para cada.
Endereços Classe C possuem 24 bits para o NetID e 8 para o
HostID.
Extensões de Endereço da
Sub-Rede e da Super-Rede • Os sites individuais podem modificar os
endereços e as rotas, desde que: – Estas mudanças permaneçam invisíveis para os outros sites.
– Todos os hosts e roteadores do site concordem em reconhecer o
esquema de endereçamento dele.
• Estes esquemas especiais de endereçamento
tornaram-se importantes por causa do crescimento
da Internet, acima do esperado pelos projetistas do
TCP/IP.
• Como reduzir o número de endereços de rede
atribuídos sem destruir o esquema de
endereçamento original?
Redução dos Números da Rede
• Uma idéia simples seria utilizar endereços classe
C em lugar de endereços classe B.
• Problemas:
– As informações de roteamento devem ser alteradas em
todas a máquinas que estão conectadas às redes
envolvidas.
– Como fazer com os endereços classe C?
• Para reduzir os endereços de rede, o mesmo
prefixo do endereço IP deve ser compartilhado por
múltiplas redes físicas.
• A técnica mais utilizada, que se tornou padrão, é a
sub-rede IP
Endereçamento da Sub-Rede
• O modo mais fácil de entender o endereçamento
de sub-rede é imaginar que um site tenha um
endereço classe B atribuído a ele, mas tenha que
tenha duas ou mais redes físicas.
• Somente os roteadores locais sabem da existência
de múltiplas redes físicas.
• Os roteadores dos outros sites roteiam todo o
tráfego como se houvesse uma única rede física.
Endereçamento da Sub-Rede
• Conceitualmente, a inserção de sub-redes altera
ligeiramente a interpretação dos endereços IP:
• Em vez de se ter um prefixo de rede e
um sufixo de host, tem-se uma parte da
rede e uma parte local.
• A interpretação da parte da rede permanece
inalterada.
• A interpretação da parte local fica a cargo do site.
Endereçamento da Sub-Rede
• Isto nos dá um endereçamento hierárquico que nos
leva a um roteamento hierárquico, similar ao que
acontece no sistema telefônico.
Endereçamento da Sub-Rede
Flexibilidade na Atribuição de
Endereços da Sub-Rede
• O padrão especifica que um site que utiliza o
endereçamento de sub-rede deve escolher uma
máscara de sub-rede de 32 bits para cada rede.
• O bits da máscara são definidos como 1, caso
sejam tratados com parte do endereço da rede.
• O bits da máscara são definidos como 0, caso
sejam tratados com parte do endereço do host.
• Exemplo:
11111111 11111111 11111111 00000000
• Esta máscara especifica que os 3 primeiros octectos
identificam a rede e o quarto octecto identifica um host
nesta rede.
Implementação de Sub-Redes
com Máscaras
• O algoritmo de roteamento padrão deve ser alterado
para funcionar com os endereços de sub-rede.
• O algoritmo de roteamento continua baseando-se em
tabelas de rotas para tomar suas decisões.
• Entretanto, em vez de ter-se entradas do tipo: (endereço da rede, endereço do próximo passo da rota)
teremos: (máscara da sub-rede, endereço da rede, endereço do próximo passo da rota)
• O algoritmo executa um “and” bit a bit entre o
endereço IP de destino e a máscara e compara o
resultado com o endereço da rede, para decidir ou
não pelo roteamento por aquela entrada.
Roteamento na Presença de
Sub-Redes
Algoritmo de Roteamento
Modificado
• Observe que este algoritmo não trata explicitamente
das exceções como roteamento para host específico
e rotas default.
• Contudo eles podem ser simulados usando máscaras
apropriadas: – Usa-se uma máscara com todos bits iguais a 1, juntamente com o
endereço IP do host para mapear para um host específico
– Usa-se uma máscara com todos bits iguais a 0, juntamente com um
endereço de rede com todos os bits 0 para mapear uma rota default.
• Além disso, as máscaras podem direcionar as rotas
para as redes convencionais. – Exemplo: Redes classe B, usam máscaras com os dois primeiros
octetos compostos de bits 1 e os outros dois de bits zero.
Algoritmo de Roteamento
Modificado
• Objetivos:
–Em vez de utilizar um único endereço IP de rede
para múltiplas redes físicas em determinada
organização, a divisão de super-rede permite o
uso de muitos endereços IP de rede para uma
única organização.
– Isto se faz necessário em organizações onde
endereços classe C são insuficientes e endereços
classe B são mais do que o necessário. Por
exemplo: Num Fornecedor de Serviços de Rede.
Endereçamento de Super-Rede
• Uma técnica conhecida como CIDR (ClassLess
Inter-Domain Routing) resolve este problema.
• Ela utiliza uma única entrada para representar o
bloco de endereços, representada pelo par:
(endereço da rede, contagem)
• Exemplo: A entrada (192.5.48.0, 3) especifica os
endereços 192.5.48.0, 192.5.49.0 e 192.5.50.0
• Na prática, o CIDR utiliza máscara de bits que
representa o campo contagem como uma potência de
dois.
Endereçamento de Super-Rede
• Máscara:
11111111 11111111 11111000 00000000
Notação Decimal com Ponto: 255.255.248.0
Endereçamento de Super-Rede
USER DATAGRAM PROTOCOL
UDP: Protocolo utiliza para distinguir para qual usuário
ou aplicativo deve ser encaminhado um datagrama
destinado a uma máquina que esteja executando mais
de um processo.
Problemas:
Os processos são criados e destruídos dinâmicamente e os
transmissores raramente sabem o bastante para identificar um
processo de uma outra máquina.
Deseja-se substituir os processos (no caso de uma
reinicialização da máquina) sem informar a todos os
transmissores.
Como permitir que um transmissor entre em contato com um
servidor (de arquivos, por exemplo) sem saber qual processo na
máquina de destino.
User Datagram Protocol
• Solução:
• Portas de protocolo: São pontos de destino abstratos,
identificadas por um número inteiro positivo.
• Elas utilizam “buffer”, que modo que os dados que
chegarem antes que um processo esteja pronto para
aceitá-los não sejam perdidos. Os buffers são
implementados como filas.
• Para comunicar-se com uma porta exterior, um
transmissor precisa conhecer tanto o endereço IP como
o número da porta na máquina de destino.
• Além da porta de destino, uma mensagem UDP deve ter
também a informação sobre a porta de origem para
onde as respostas deverão ser endereçadas.
User Datagram Protocol
• Assim como o IP, o UDP oferece um serviço não-confiável
de transmissão sem conexão.
• Desta forma, fica a cargo do aplicativo resolver o problema
da confiabilidade, como perda de mensagens, duplicação,
retardo, transmissão defeituosa e perda de conectividade.
• Formato de mensagens UDP:
• O campo Comprimento contém o número de octetos na mensagem UDP
• O campo Soma de Verificação é opcional, pois evita overhead em redes de alta confiabilidade.
User Datagram Protocol
• Pseudocabeçalho UDP
• Tem como finalidade verificar se a mensagem UDP
atingiu o seu destino correto.
• O destino correto consiste em uma máquina específica e
uma porta específica dentro desta máquina.
• O pseudocabeçalho não é transmitido junto como a
mensagem UDP, mas a soma de verificação o abrange.
• No destino final, o pseudocabeçalho é remontado a
partir do datagrama IP
User Datagram Protocol
• Encapsulamento UDP
• Colocação conceitual em camadas
User Datagram Protocol
• Contradição entre organização em camadas e o cálculo da
soma de verificação UDP.
• Multiplexação: O software UDP aceita mensagens de
muitos programas aplicativos e os passa ao IP.
• Demultiplexação: E aceita mensagens UDP recebida de IP
e as passa ao programa aplicativo apropriado.
• Quando o UDP recebe uma mensagem, verifica se o
número da porta de destino confere com uma das portas
atualmente em uso. Se não houver correspondência, a
mensagem é descartada e uma mensagem de erro é
enviada. Caso contrário, o UDP enfileira a mensagem na
porta apropriada. Se não houver espaço na fila, a
mensagem é descartada e uma mensagem de erro é gerada.
User Datagram Protocol
User Datagram Protocol
• Como deverão ser atribuídos números de porta de
protocolo?
1. Uso de autoridade central que atribua números de
portas de acordo com a necessidade e publique a lista.
2. Atribuição dinâmica: Sempre que um programa
necessita de uma porta, o software de rede atribui uma.
Para saber que número de porta a máquina de destino
está usando, o emissor enviar uma mensagem
perguntando: “que porta o serviço X está usando?”
• O TCP/IP usa uma abordagem híbrida. Algumas portas são
atribúidas a priori e outras são deixadas a cargo dos
aplicativos.
UDP: PROGRAMAÇÃO SOCKET
Interação Cliente/Servidor usando UDP:
Servidor Cliente
Cria Socket:
socketServidor =
DatagramSocket()
Lê mensagem de
socketServidor
Escreve resposta
em socketServidor
Cria Socket:
socketCliente =
DatagramSocket()
Cria endereço: host, porta de
origem. Envia mensagem
em socketCliente
Lê resposta de socketCliente
Fecha socketCliente
PROGRAMAÇÃO SOCKET COM UDP:
EXEMPLO USANDO JAVA import java.io.*;
import java.net.*;
public class ClienteUDP {
public static void main(String argv[]) throws Exception
{
int porta;
byte[] dadosEnviados;
byte[] dadosRecebidos = new byte[1024];
String frase = null;
String fraseModificada = null;
//argv[1] contem o numero da porta do servidor no host
porta = (new Integer(argv[1])).intValue();
//Cria Stream de entrada. Redireciona entrada do teclado
BufferedReader entradaDoUsuario =
new BufferedReader(new InputStreamReader(System.in));
//Cria socket cliente
DatagramSocket socketCliente = new DatagramSocket();
//Localiza o host especificado na linha de comando.
//A classe InetAddress contem as informacoes de end. IP do host
InetAddress enderecoIP = InetAddress.getByName(argv[0]);
PROGRAMAÇÃO SOCKET COM UDP:
EXEMPLO USANDO JAVA //Le frase do teclado
frase = entradaDoUsuario.readLine();
dadosEnviados = frase.getBytes();
//Cria datagrama de envio. Em JAVA, a classe DatagramPacket e' usada para
//conter as informacoes do datagrama. Estas informacoes sao: array de
//bytes (dadosEnviados), comprimento do array, endereco IP do destino,
//porta UDP do destino.
DatagramPacket datagramaEnviado =
new DatagramPacket(dadosEnviados, dadosEnviados.length, enderecoIP, porta);
//Envia datagrama para servidor
socketCliente.send(datagramaEnviado);
//Espera resposta do servidor
//Cria datagrama para receber mensagem do servidor
DatagramPacket datagramaRecebido =
new DatagramPacket(dadosRecebidos, dadosRecebidos.length);
//Recebe datagrama do servidor
socketCliente.receive(datagramaRecebido);
//Imprime resultado
fraseModificada = new String(datagramaRecebido.getData());
System.out.println(enderecoIP.getHostName() + " : " + fraseModificada);
//Fecha socket
socketCliente.close();}}
PROGRAMAÇÃO SOCKET COM UDP:
EXEMPLO USANDO JAVA import java.io.*;
import java.net.*;
import java.util.*;
public class ServidorUDP {
public static void main(String argv[]) throws Exception
{
byte[] dadosEnviados;
byte[] dadosRecebidos = new byte[1024];
String frase, fraseModificada;
InetAddress enderecoIPDoCliente;
int portaDoCliente;
//Cria socket UDP na porta 6789
DatagramSocket socketServidor = new DatagramSocket(6789);
while(true)
{
//Cria datagrama para receber mensagem do cliente
DatagramPacket datagramaRecebido =
new DatagramPacket(dadosRecebidos, dadosRecebidos.length);
//Recebe datagrama
socketServidor.receive(datagramaRecebido);
PROGRAMAÇÃO SOCKET COM UDP:
EXEMPLO USANDO JAVA //O servidor deve obter o endereco IP do cliente e a porta UDP de origem.
//Isto se deve ao fato do protocolo UDP ser sem conexao, ou seja, cada pacote
//enviado deve conter o endereco do destino.
enderecoIPDoCliente = datagramaRecebido.getAddress();
portaDoCliente = datagramaRecebido.getPort();
//Executa o processamento. Neste caso, converte a frase para letras maiusculas
frase = new String(datagramaRecebido.getData());
System.out.println(enderecoIPDoCliente.getHostName() + " : " + frase);
fraseModificada = frase.toUpperCase();
//Prepara resposta para ser enviada ao cliente
//Converte String para byte[]
dadosEnviados = fraseModificada.getBytes();
//Cria datagrama para enviar a resposta ao cliente
DatagramPacket datagrama = new DatagramPacket(dadosEnviados, dadosEnviados.length,
enderecoIPDoCliente, portaDoCliente);
//Envia resposta para o cliente
socketServidor.send(datagrama);
//Para assegurar que nenhuma parte da mensagem anterior continue presente,
// preencha o buffer de dados recebidos com 0.
Arrays.fill(dadosRecebidos, (byte)0);
//Fim do loop while. Volta para o inicio e espera por outro datagrama
//Note que nao ha a necessidade de fechar um "socket de conexao". Porque ?
}
}
}
PROGRAMAÇÃO SOCKET COM UDP:
EXEMPLO USANDO JAVA //O servidor deve obter o endereco IP do cliente e a porta UDP de origem.
//Isto se deve ao fato do protocolo UDP ser sem conexao, ou seja, cada pacote
//enviado deve conter o endereco do destino.
enderecoIPDoCliente = datagramaRecebido.getAddress();
portaDoCliente = datagramaRecebido.getPort();
//Executa o processamento. Neste caso, converte a frase para letras maiusculas
frase = new String(datagramaRecebido.getData());
System.out.println(enderecoIPDoCliente.getHostName() + " : " + frase);
fraseModificada = frase.toUpperCase();
//Prepara resposta para ser enviada ao cliente
//Converte String para byte[]
dadosEnviados = fraseModificada.getBytes();
//Cria datagrama para enviar a resposta ao cliente
DatagramPacket datagrama = new DatagramPacket(dadosEnviados, dadosEnviados.length,
enderecoIPDoCliente, portaDoCliente);
//Envia resposta para o cliente
socketServidor.send(datagrama);
//Para assegurar que nenhuma parte da mensagem anterior continue presente,
// preencha o buffer de dados recebidos com 0.
Arrays.fill(dadosRecebidos, (byte)0);
//Fim do loop while. Volta para o inicio e espera por outro datagrama
//Note que nao ha a necessidade de fechar um "socket de conexao". Porque ?
}
}
}
PROGRAMAÇÃO SOCKET COM UDP
Resumo dos métodos utilizados:
Class DatagramSocket
void close() : Fecha o socket UDP.
void connect(InetAddress address, int port) : Conecta o socket a um endereço remoto.
void disconnect() : Desconecta o socket.
InetAddress getInetAddress() : Retorna o endereço ao qual este socket esta conectado.
InetAddress getLocalAddress() : Obtém o endereço local, ao qual o socket esta associado.
int getLocalPort() : Retorna o número da porta ‘a qual o socket esta associado.
int getPort() : Retorna a porta remota deste socket.
void receive(DatagramPacket p) : Recebe um datagrama.
void send(DatagramPacket p) : Envia um datagrama.
voidsetSoTimeout(int timeout) : Habilita/Desabilita SO_TIMEOUT, para o tempo timeout, em
milisegundos. Este é o máximo tempo que o método receive irá esperar por datagrama.
SERVIÇO CONFIÁVEL DE TRANSPORTE
TCP (TRANSMISSION CONTROL PROTOCOL)
Motivação
Em um nível mais baixo, as redes de comunicação
fornecem uma entrega de pacotes não-confiável.
Em um nível mais alto, os aplicativos frequentemente
precisam enviar grandes volumes de dados.
A utilização de um serviço de transmissão sem conexão e
não-confiável (como o UDP) torna-se tediosa e irritante a
tarefa de programar aplicativos.
O TCP constitui um protocolo de transmissão (confiável)
do qual todos os aplicativos podem fazer uso.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Características:
– Orientação do Stream:
– O serviço de transmissão de streams da máquina de destino recebe
exatamente a mesma sequencia de octetos que o trasmissor passa
para ele.
– Conexão de Circuito Virtual:
– Fazer uma transferência de stream de dados equivale a fazer uma
chamada telefônica.
– Transmissão Bufferizada:
– O protocolo agrupa ou divide o stream de dados para garantir uma
transferência mais eficaz.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Características:
– Stream Desestruturado:
– O serviço de stream TCP/IP não reconhece os streams de dados
estruturados pelos aplicativos.
– Conexão Full Duplex :
– As conexões fornecidas pelo TC/IP permitem transferência em
ambas direções.
– Utiliza “piggyback” (carona) para confirmações dos dados, reduzin-
do o tráfego na rede.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Oferecendo Confiabilidade:
– Pergunta: Como um protocolo pode oferecer uma
transferência confiável se o sistema básico de comunicação
proporciona apenas transmissão de pacotes não-confiável?
– Resposta: Confirmação positiva com retransmissão.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Oferecendo Confiabilidade: – A figura abaixo mostra o que acontece quando um pacote é perdido ou
destruído.
– Outro problema que deve ser considerado é a duplicação de pacotes, que
ocorre quando um ACK é perdido ou uma retransmissão prematura é
feita devido a atrasos na rede. (Solução: Uso de números de sequência.)
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• As Janelas Deslizantes: – Os protocolos de janela deslizante permitem que o transmissor transmita
pacotes múltiplos antes de esperar uma confirmação.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• As Janelas Deslizantes: – Exemplo de três pacotes transmitidos com um protocolo de janela
deslizante. O conceito principal é que o transmissor pode transmitir todos
os pacotes da janela, sem aguardar uma confirmação.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Portas, Conexões e Pontos Terminais: – Assim como o UDP, o TCP se encontra na camada acima do IP (como
pode ser visto na figura abaixo) e usa o conceito de portas de protocolo
para identifica o destino final numa máquina.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Portas, Conexões e Pontos Terminais: – O TCP utiliza a conexão, e não a porta de protocolo, como sua abstração
principal. As conexões são identificadas por um par de pontos terminais.
– Um ponto terminal é um par de números inteiros (host, porta), onde host
é o endereço IP para um host, e porta é uma porta TCP naquele host.
– Exemplos:
– Conexão da máquina (18.26.0.36) em Massachusetts com a máquina
(128.10.2.3) em Purdue:
(18.26.0.36, 1069) e (128.10.2.3, 25)
– Conexão da máquina (128.9.0.32) em Seattle com a mesma máquina
em Purdue:
(128.9.0.32, 1184) e (128.10.2.3, 53)
– Conexão da máquina (128.2.254.139) no CMU com a máquina em
Purdue:
(128.2.254.139, 1184) e (128.10.2.3, 53)
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
Outras características: 1. O TCP considera o stream de
dados uma sequência de octetos
que ele divide em segmentos
para a transmissão.
2. Ele utiliza janelas deslizantes
tanto para obter uma transmissão
eficaz quanto para fazer o
controle de fluxo.
3. O mecanismo de janela deslizantes
opera em nível de octetos e não de
segmentos. O transmissor mantém
três ponteiros associados a janela
deslizante de cada conexão.
4. O tamanho da janela pode variar
com o passar do tempo devido ao
controle de fluxo e ao controle de
congestionamento.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Formato do Segmento TCP:
• CODE BITS: Informa a finalidade e o conteúdo do segmento (confirmação, dados,
estabelecimento ou encerramento de conexão)
• WINDOW: Informa quantos dados está esperando receber.
• URGENT POINTER: Usado, por exemplo, quando o usuário deseja abortar ou
interromper um programa.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Reação ao Congestionamento:
• Congestionamento: É uma condição de retardo longo causado por
sobrecarga de datagramas em um ou mais pontos de comutação.
• Numa situação de congestionamento os protocolos, normalmente,
detectariam o retardo e fariam a retransmissão dos datagramas,
aumentando ainda mais o congestionamente, até que a rede se tornasse
inútil, causando o colapso de congestionamento.
• O TCP utiliza duas técnicas para controle de congestionamento:
• Slow Start (Início lento): Inicia a janela de transmissão no tamanho
de um segmento e aumenta em um a cada confirmação que chega.
• Multiplicative Decrease (Redução Multiplicável): Reduz a janela de
transmissão pela metade, quando ocorre a perda de um segmento.
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Estabelecendo uma conexão: • O TCP utiliza um handshake de três vias, como pode ser visto na figura
abaixo:
Serviço Confiável de Transporte
TCP (Transmission Control Protocol)
• Encerrando uma conexão: • O TCP utiliza um handshake de três vias modificado, como pode ser
visto na figura abaixo:
Síndrome da Janela Desnecessária
As implementações TCP anteriores apresentavam
um problema conhecido como síndrome de
janela desnecessária, na qual cada confirmação
informa que uma pequena área disponível em
cada segmento transporta uma pequena
quantidade de dados.
Evitando a Janela Desnecessária
No receptor:
• Antes de enviar uma informação atualizada de janela, depois de
informar uma janela zero, espere até que o espaço disponível
seja no mínimo 50% do tamanho total do buffer, ou igual ao
tamanho máximo de um segmento.
No transmissor:
• Quando um aplicativo gera dados adicionais a serem enviados
através de uma conexão para a qual os dados anteriores foram
transmitidos, mas não confirmados, coloque os novos dados em
um buffer como sempre, mas não envie segmentos até que haja
dados suficientes para preencher um segmento de tamanho
máximo.