Sei sulla pagina 1di 35

DNS: Domain Name System

Pessoas: muitos Domain Name System:


identificadores:  base de dados distribuída
 CPF, nome, no. da implementada na hierarquia de
Identidade muitos servidores de nomes
hospedeiros, roteadores  protocolo de camada de aplicação
permite que hospedeiros,
Internet : roteadores, servidores de nomes
 endereço IP (32 bit) - se comuniquem para resolver
usado p/ endereçar nomes (tradução endereço/nome)
datagramas  note: função imprescindível da
 “nome”, ex., Internet implementada como
jambo.ic.uff.br - usado protocolo de camada de
por gente aplicação
P: como mapear entre  complexidade na borda da rede
nome e endereço IP? 2: Camada de Aplicação 1
DNS
 Roda sobre UDP e usa  Outros serviços:
a porta 53  apelidos para

 Especificado nas RFCs hospedeiros (aliasing)


 apelido para o servidor
1034 e 1035 e
de mails
atualizado em outras
 distribuição da carga
RFCs.

2: Camada de Aplicação 2
Servidores de nomes DNS
Por que não centralizar o  Nenhum servidor mantém
DNS? todos os mapeamento nome-
 ponto único de falha para-endereço IP
 volume de tráfego servidor de nomes local:
 cada provedor, empresa tem
 base de dados
servidor de nomes local (default)
centralizada e distante  pedido DNS de hospedeiro vai
 manutenção (da BD) primeiro ao servidor de nomes
local

Não é escalável! servidor de nomes oficial:


 p/ hospedeiro: guarda nome,
endereço IP dele
 pode realizar tradução
nome/endereço para este nome
2: Camada de Aplicação 3
DNS: Servidores raiz

 procurado por servidor


local que não consegue
resolver o nome
 servidor raiz:
 procura servidor
oficial se
mapeamento
desconhecido
 obtém tradução
 devolve
mapeamento ao
servidor local
 ~ uma dúzia de
servidores raiz no
mundo
2: Camada de Aplicação 4
Exemplo simples do DNS
servidor de
nomes raiz
hospedeiro
manga.ic.uff.br requer 2 4
3
endereço IP de 5
www.cs.columbia.edu
1. Contata servidor DNS local,
pitomba.ic.uff.br
servidor local servidor oficial
2. pitomba.ic.uff.br cs.columbia.edu
pitomba.ic.uff.br
contata servidor raiz, se
necessário 1 6
3. Servidor raiz contata
servidor oficial
cs.columbia.edu, se
solicitante www.cs.columbia.edu
necessário manga.ic.uff.br

2: Camada de Aplicação 5
Exemplo de DNS
servidor de
nomes raiz
Servidor raiz: 6
2
 pode não conhecer o 7 3
servidor de nomes
oficial
 pode conhecer
servidor de nomes servidor intermediário
servidor local
intermediário: a quem pitomba.ic.uff.br saell.cc.columbia.edu
contatar para 4 5
descobrir o servidor 1 8
de nomes oficial
servidor oficial
cs.columbia.edu
solicitante
manga.ic.uff.br

www.cs.columbia.edu

2: Camada de Aplicação 6
DNS: consultas interativas servidor de
nomes raíz

consulta recursiva: consulta


2 interativa
 transfere a 3
responsabilidade de
4
resolução do nome
para o servidor de 7
nomes contatado
servidor local servidor intermediário
 carga pesada? pitomba.ic.uff.br saell.cc.columbia.edu
5
consulta interativa:
6
1 8
 servidor consultado
responde com o nome servidor oficial
de um servidor de cs.columbia.edu
solicitante
contato manga.ic.uff.br
 “Não conheço este
www.cs.columbia.edu
nome, mas pergunte
para esse servidor” 2: Camada de Aplicação 7
DNS: uso de cache, atualização de dados
 uma vez que um servidor qualquer aprende um
mapeamento, ele o coloca numa cache local
 futuras consultas são resolvidas usando dados
da cache
 entradas na cache são sujeitas a temporização
(desaparecem depois de um certo tempo)
ttl = time to live (sobrevida)
 estão sendo projetados pela IETF mecanismos
de atualização/notificação dos dados
 RFC 2136
 http://www.ietf.org/html.charters/dnsind-charter.html

2: Camada de Aplicação 8
Registros DNS
DNS: BD distribuído contendo registros de recursos (RR)

formato RR: (nome, valor, tipo, sobrevida)

 Tipo=A  Tipo=CNAME
 nome é nome de hospedeiro  nome é nome alternativo
 valor é o seu endereço IP (alias) para algum nome
“canônico” (verdadeiro)
 Tipo=NS  valor é o nome
 nome é domínio (p.ex. canônico
foo.com.br)
 valor é endereço IP de
 Tipo=MX
servidor oficial de nomes  nome é domínio
para este domínio  valor é nome do servidor de
correio para este domínio
2: Camada de Aplicação 9
DNS: protocolo e mensagens
protocolo DNS: mensagens de pedido e resposta,
ambas com o mesmo formato de mensagem

cabeçalho de msg
 identificação: ID de 16 bit
para pedido, resposta ao
pedido usa mesmo ID
 flags:
 pedido ou resposta
 recursão desejada
 recursão permitida
 resposta é oficial

2: Camada de Aplicação 10
DNS: protocolo e mensagens

campos de nome, e
de tipo num pedido

RRs em resposta
ao pedido

registros para outros


servidores oficiais
info adicional
“relevante” que
pode ser usada

2: Camada de Aplicação 11
Programação com sockets
Meta: aprender a construir aplicações cliente/servidor
que se comunicam usando sockets
socket
API Sockets uma interface (uma
 apareceu no BSD4.1 UNIX “porta”), local ao
em 1981 hospedeiro, criada por e
 são explicitamente criados, pertencente à aplicação, e
usados e liberados por apls controlado pelo SO,
 paradigma cliente/servidor através da qual um
processo de aplicação
 dois tipos de serviço de
pode tanto enviar como
transporte via API Sockets
receber mensagens
 datagrama não confiável
para/de outro processo
 fluxo de bytes, confiável de aplicação
(remoto ou local)

2: Camada de Aplicação 12
Programação com sockets usando TCP
Socket: uma porta entre o processo de aplicação e um
protocolo de transporte fim-a-fim (UDP ou TCP)
Serviço TCP: transferência confiável de bytes de um
processo para outro

controlado pelo
controlado pelo processo programador de
programador de processo
aplicação
aplicação
socket socket
TCP com TCP com controlado
controlado
buffers, pelo sistema
pelo sistema buffers, internet operacional
operacional variáveis variáveis

estação ou estação ou
servidor servidor

2: Camada de Aplicação 13
Programação com sockets usando TCP
Cliente deve contactar servidor  Quando cliente cria socket: TCP
 processo servidor deve antes do cliente estabelece conexão com
estar em execução TCP do servidor
 servidor deve antes ter  Quando contatado pelo cliente, o
criado socket (porta) que TCP do servidor cria socket novo
aguarda contato do cliente para que o processo servidor possa
se comunicar com o cliente
Cliente contacta servidor para:
 permite que o servidor
 criar socket TCP local ao
converse com múltiplos clientes
cliente
 especificar endereço IP, ponto de vista da aplicação
número de porta do processo
servidor TCP provê transferência
confiável, ordenada de bytes
(“tubo”) entre cliente e servidor

2: Camada de Aplicação 14
Comunicação entre sockets

2: Camada de Aplicação 15
Exemplo de aplicação cliente-servidor
Fluxo de entrada: seqüência
 cliente lê linha da entrada
de bytes recebida pelo
padrão (fluxo doUsuário),
processo
envia para servidor via socket
(fluxo paraServidor) Fluxo de saída: seqüência de
bytes transmitida pelo
 servidor lê linha do socket
processo
 servidor converte linha para
letras maiúsculas, devolve
para o cliente
 cliente lê linha modificada do
socket (fluxo doServidor),
imprime-a

socket do cliente

2: Camada de Aplicação 16
Interações cliente/servidor usando o TCP
Servidor (executa em nomeHosp) Cliente
cria socket,
porta=x, para
receber pedido:
socketRecepção =
ServerSocket ()
TCP cria socket,
aguarda chegada de
pedido de conexão setup da conexão abre conexão a nomeHosp, porta=x
socketCliente =
socketConexão =
Socket()
socketRecepção.accept()

Envia pedido usando


lê pedido de socketCliente
socketConexão

escreve resposta
para socketConexão lê resposta de
socketCliente
fecha
socketConexão fecha
socketCliente
2: Camada de Aplicação 17
Exemplo: cliente Java (TCP)
import java.io.*;
import java.net.*;
class ClienteTCP {

public static void main(String argv[]) throws Exception


{
String frase;
String fraseModificada;
Cria
fluxo de entrada BufferedReader doUsuario =
new BufferedReader(new InputStreamReader(System.in));
Cria
socket de cliente, Socket socketCliente = new Socket(”nomeHosp", 6789);
conexão ao servidor
Cria DataOutputStream paraServidor =
fluxo de saída new DataOutputStream(socketCliente.getOutputStream());
ligado ao socket
2: Camada de Aplicação 18
Exemplo: cliente Java (TCP), cont.

Cria BufferedReader doServidor =


fluxo de entrada new BufferedReader(new
ligado ao socket InputStreamReader(socketCliente.getInputStream()));

frase = doUsuario.readLine();
Envia linha
ao servidor paraServidor.writeBytes(frase + '\n');

Lê linha fraseModificada = doServidor.readLine();


do servidor
System.out.println(”Do Servidor: " + fraseModificada);

socketCliente.close();

}
}
2: Camada de Aplicação 19
Exemplo: servidor Java (TCP)
import java.io.*;
import java.net.*;

class servidorTCP {

public static void main(String argv[]) throws Exception


{
String fraseCliente;
Cria socket StringfFraseMaiusculas;
para recepção
ServerSocket socketRecepcao = new ServerSocket(6789);
na porta 6789
while(true) {
Aguarda, no socket
para recepção, o Socket socketConexao = socketRecepcao.accept();
contato do cliente
BufferedReader doCliente =
Cria fluxo de new BufferedReader(new
entrada, ligado InputStreamReader(socketConexao.getInputStream()));
ao socket

2: Camada de Aplicação 20
Exemplo: servidor Java (TCP), cont

Cria fluxo
de saída, ligado DataOutputStream paraCliente =
ao socket new DataOutputStream(socketConexão.getOutputStream());
Lê linha
do socket fraseCliente= doCliente.readLine();

fraseEmMaiusculas= fraseCliente.toUpperCase() + '\n';


Escreve linha
paraClient.writeBytes(fraseEmMaiusculas);
ao socket
}
}
} Final do elo while,
volta ao início e aguarda
conexão de outro cliente

2: Camada de Aplicação 21
Programação com sockets usando UDP

UDP: não tem “conexão” entre


cliente e servidor
 não tem “handshaking”
 remetente coloca ponto de vista da aplicação
explicitamente endereço IP UDP provê transferência
e porta do destino não confiável de grupos
 servidor deve extrair de bytes (“datagramas”)
endereço IP, porta do entre cliente e servidor
remetente do datagrama
recebido
UDP: dados transmitidos
podem ser recebidos fora
de ordem, ou perdidos

2: Camada de Aplicação 22
Interações cliente/servidor usando o UDP
Servidor (executa em nomeHosp) Cliente

cria socket, cria socket,


porta=x, para socketCliente =
pedido que chega: DatagramSocket()
socketServidor =
DatagramSocket()
cria, endereça (nomeHosp, porta=x,
envia pedido em datagrama
usando socketCliente
lê pedido do
socketServidor

escreve resposta
ao socketServidor
especificando endereço lê resposa do
IP, número de porta socketCliente
do cliente fecha
socketCliente

2: Camada de Aplicação 23
Cliente UDP

2: Camada de Aplicação 24
Exemplo: cliente Java (UDP)
import java.io.*;
import java.net.*;

class clienteUDP {
public static void main(String args[]) throws Exception
{
Cria
fluxo de entrada BufferedReader do Usuario=
new BufferedReader(new InputStreamReader(System.in));
Cria
socket de cliente DatagramSocket socketCliente = new DatagramSocket();
Traduz nome de
InetAddress IPAddress = InetAddress.getByName(”nomeHosp");
hospedeiro ao
endereço IP byte[] sendData = new byte[1024];
usando DNS byte[] receiveData = new byte[1024];

String frase = doUsuario.readLine();


sendData = frase.getBytes();
2: Camada de Aplicação 25
Exemplo: cliente Java (UDP) cont.
Cria datagrama com
dados para enviar, DatagramPacket pacoteEnviado =
comprimento, new DatagramPacket(dadosEnvio, dadosEnvio.length,
endereço IP, porta IPAddress, 9876);

Envia datagrama socketCliente.send(pacoteEnviado);


ao servidor
DatagramPacket pacoteRecebido =
new DatagramPacket(dadosRecebidos, dadosRecebidos.length);
Lê datagrama
do servidor socketCliente.receive(pacoteRecebido);

String fraseModificada =
new String(pacoteRecebido.getData());

System.out.println(”Do Servidor:" + fraseModificada);


socketCliente.close();
}
}

2: Camada de Aplicação 26
Servidor UDP

2: Camada de Aplicação 27
Exemplo: servidor Java (UDP)
import java.io.*;
import java.net.*;

class servidorUDP {
public static void main(String args[]) throws Exception
Cria socket {
para datagramas
DatagramSocket socketServidor = new DatagramSocket(9876);
na porta 9876
byte[] dadosRecebidos = new byte[1024];
byte[] dadosEnviados = new byte[1024];

while(true)
{
Aloca memória para DatagramPacket pacoteRecebido =
new DatagramPacket(dadosRecebidos,
receber datagrama
dadosRecebidos.length);
Recebe socketServidor.receive(pacoteRecebido);
datagrama
2: Camada de Aplicação 28
Exemplo: servidor Java (UDP), cont
String frase = new String(pacoteRecebido.getData());
Obtém endereço
InetAddress IPAddress = pacoteRecebido.getAddress();
IP, no. de porta
do remetente int porta = pacoteRecebido.getPort();

String fraseEmMaiusculas = frase.toUpperCase();

dadosEnviados = fraseEmMaiusculas.getBytes();
Cria datagrama p/
DatagramPacket pacoteEnviado =
enviar ao cliente new DatagramPacket(dadosEnviados,
dadosEnviados.length, IPAddress, porta);
Escreve
datagrama socketServidor.send(pacoteEnviado);
no socket }
}
} Fim do elo while,
volta ao início e aguarda
chegar outro datagrama
2: Camada de Aplicação 29
Servidor Web Simples
 Funções do servidor Web:
 Trata apenas um pedido HTTP por vez
 Aceita e examina o pedido HTTP
 Recupera o arquivo pedido do sistema de
arquivos do servidor
 Cria uma mensagem de resposta HTTP
consistindo do arquivo solicitado precedido por
linhas de cabeçalho
 Envia a resposta diretamente ao cliente.

2: Camada de Aplicação 30
Servidor Web Simples
Contém a classe import java.io.*;
StringTokenizer que é import java.net.*;
usada para examinar import java.util.*;
o pedido
class WebServer {
public static void main(String argv[]) throws Exception
Primeira linha da mensagem {
de pedido HTTP e String requestMessageLine;
Nome do arquivo solicitado String fileName;

Aguarda conexão ServerSocket listenSocket = new ServerSocket(6789);


do cliente Socket connectionSocket = listenSocket.accept();

Cria fluxo BufferedReader inFromClient =


de Entrada new BufferedReader(new InputStreamReader(
connectionSocket.getInputStream()));

Cria fluxo DataOutputStream outToClient =


de Saída new DataOutputStream(
connectionSocket.getOutputStream());

2: Camada de Aplicação 31
Servidor Web Simples, cont
Lê a primeira linha do
pedido HTTP que deveria
ter o seguinte formato: requestMessageLine = inFromClient.readLine();
GET file_name HTTP/1.0
StringTokenizer tokenizedLine =
Examina a primeira linha new StringTokenizer(requestMessageLine);
da mensagem para extrair if (tokenizedLine.nextToken().equals("GET")){
fileName = tokenizedLine.nextToken();
o nome do arquivo
if (fileName.startsWith("/") == true )
fileName = fileName.substring(1);

File file = new File(fileName);


int numOfBytes = (int) file.length();
Associa o fluxo inFile
ao arquivo fileName FileInputStream inFile = new FileInputStream (
fileName);
Determina o tamanho do
arquivo e constrói um vetor byte[] fileInBytes = new byte[];
de bytes do mesmo tamanho inFile.read(fileInBytes);

2: Camada de Aplicação 32
Servidor Web Simples, cont

Inicia a construção da outToClient.writeBytes(


mensagem de resposta "HTTP/1.0 200 Document Follows\r\n");

if (fileName.endsWith(".jpg"))
outToClient.writeBytes("Content-Type: image/jpeg\r\n");
Transmissão do if (fileName.endsWith(".gif"))
cabeçalho da resposta outToClient.writeBytes("Content-Type:
HTTP. image/gif\r\n");
outToClient.writeBytes("Content-Length: " + numOfBytes +
"\r\n");
outToClient.writeBytes("\r\n");

outToClient.write(fileInBytes, 0, numOfBytes);
connectionSocket.close();
}

else System.out.println("Bad Request Message");


}
}
2: Camada de Aplicação 33
Capítulo 2: Resumo
Terminamos nosso estudo de aplicações de rede!
 Requisitos do serviço  Protocolos específicos:
de aplicação:  http
 confiabilidade, banda,  ftp
retardo
 smtp, pop3
 paradigma cliente-  dns
servidor
 programação c/ sockets
 modelo de serviço do  implementação
transporte orientado a cliente/servidor
conexão, confiável da  usando sockets tcp, udp
Internet: TCP
 não confiável,
datagramas: UDP
2: Camada de Aplicação 34
Capítulo 2: Resumo
Mais importante: aprendemos sobre protocolos

 troca típica de
 msgs de controle X dados
mensagens
 na banda, fora da banda
pedido/resposta:
 centralizado X descentralizado
 cliente solicita info ou
 s/ estado X c/ estado
serviço
 transferência de msgs
 servidor responde com
confiável X não confiável
dados, código de status
 “complexidade na borda da
 formatos de mensagens: rede”
 cabeçalhos: campos com
 segurança: autenticação
info sobre dados
(metadados)
 dados: info sendo
comunicada 2: Camada de Aplicação 35

Potrebbero piacerti anche