Pessoas: muitos
identificadores:
hospedeiros, roteadores
Internet :
implementada na hierarquia de
muitos servidores de nomes
DNS
Roda sobre UDP e usa
a porta 53
Especificado nas RFCs
1034 e 1035 e
atualizado em outras
RFCs.
Outros servios:
apelidos para
hospedeiros (aliasing)
apelido para o servidor
de mails
distribuio da carga
2: Camada de Aplicao
No escalvel!
2: Camada de Aplicao
servidor de
nomes raiz
4
5
Exemplo de DNS
Servidor raiz:
pode no conhecer o
servidor de
nomes raiz
7
servidor de nomes
oficial
pode conhecer
servidor de nomes
intermedirio: a quem
contatar para
descobrir o servidor
de nomes oficial
2
3
servidor intermedirio
pitomba.ic.uff.br saell.cc.columbia.edu
5
4
1
8
servidor local
solicitante
servidor oficial
cs.columbia.edu
manga.ic.uff.br
www.cs.columbia.edu
2: Camada de Aplicao
responsabilidade de
resoluo do nome
para o servidor de
nomes contatado
carga pesada?
consulta interativa:
consulta
interativa
2
3
4
7
servidor intermedirio
pitomba.ic.uff.br saell.cc.columbia.edu
5
6
1
8
servidor local
servidor consultado
servidor de
nomes raz
solicitante
servidor oficial
cs.columbia.edu
manga.ic.uff.br
www.cs.columbia.edu
2: Camada de Aplicao
RFC 2136
http://www.ietf.org/html.charters/dnsind-charter.html
2: Camada de Aplicao
Registros DNS
DNS: BD distribudo contendo registros de recursos (RR)
formato RR: (nome,
Tipo=CNAME
Tipo=A
nome nome alternativo
nome nome de hospedeiro
(alias) para algum nome
valor o seu endereo IP
cannico (verdadeiro)
Tipo=NS
valor o nome
nome domnio (p.ex.
cannico
foo.com.br)
Tipo=MX
valor endereo IP de
nome domnio
servidor oficial de nomes
valor nome do servidor de
para este domnio
correio para este domnio
2: Camada de Aplicao
2: Camada de Aplicao
10
info adicional
relevante que
pode ser usada
2: Camada de Aplicao
11
em 1981
so explicitamente criados,
usados e liberados por apls
paradigma cliente/servidor
dois tipos de servio de
transporte via API Sockets
datagrama no confivel
fluxo de bytes, confivel
porta), local ao
hospedeiro, criada por e
pertencente aplicao, e
controlado pelo SO,
atravs da qual um
processo de aplicao
pode tanto enviar como
receber mensagens
para/de outro processo
de aplicao
(remoto ou local)
2: Camada de Aplicao
12
processo
processo
socket
TCP com
buffers,
variveis
estao ou
servidor
internet
socket
TCP com
buffers,
variveis
controlado pelo
programador de
aplicao
controlado
pelo sistema
operacional
estao ou
servidor
2: Camada de Aplicao
13
14
2: Camada de Aplicao
15
socket do cliente
2: Camada de Aplicao
16
Cliente
cria socket,
porta=x, para
receber pedido:
socketRecepo =
ServerSocket ()
aguarda chegada de
setup
pedido de conexo
socketConexo =
socketRecepo.accept()
l pedido de
socketConexo
escreve resposta
para socketConexo
fecha
socketConexo
TCP
da conexo
cria socket,
abre conexo a nomeHosp, porta=x
socketCliente =
Socket()
Envia pedido usando
socketCliente
l resposta de
socketCliente
fecha
socketCliente
2: Camada de Aplicao
17
Cria
fluxo de sada
ligado ao socket
BufferedReader doUsuario =
new BufferedReader(new InputStreamReader(System.in));
Socket socketCliente = new Socket(nomeHosp", 6789);
DataOutputStream paraServidor =
new DataOutputStream(socketCliente.getOutputStream());
2: Camada de Aplicao
18
BufferedReader doServidor =
new BufferedReader(new
InputStreamReader(socketCliente.getInputStream()));
frase = doUsuario.readLine();
Envia linha
ao servidor
paraServidor.writeBytes(frase + '\n');
L linha
do servidor
fraseModificada = doServidor.readLine();
System.out.println(Do Servidor: " + fraseModificada);
socketCliente.close();
}
}
2: Camada de Aplicao
19
Cria socket
para recepo
na porta 6789
Aguarda, no socket
para recepo, o
contato do cliente
Cria fluxo de
entrada, ligado
ao socket
while(true) {
Socket socketConexao = socketRecepcao.accept();
BufferedReader doCliente =
new BufferedReader(new
InputStreamReader(socketConexao.getInputStream()));
2: Camada de Aplicao
20
DataOutputStream paraCliente =
new DataOutputStream(socketConexo.getOutputStream());
L linha
do socket
fraseCliente= doCliente.readLine();
fraseEmMaiusculas= fraseCliente.toUpperCase() + '\n';
Escreve linha
ao socket
paraClient.writeBytes(fraseEmMaiusculas);
}
}
2: Camada de Aplicao
21
22
l pedido do
socketServidor
escreve resposta
ao socketServidor
especificando endereo
IP, nmero de porta
do cliente
Cliente
cria socket,
socketCliente =
DatagramSocket()
cria, enderea (nomeHosp, porta=x,
envia pedido em datagrama
usando socketCliente
l resposa do
socketCliente
fecha
socketCliente
2: Camada de Aplicao
23
Cliente UDP
2: Camada de Aplicao
24
Cria
fluxo de entrada
Cria
socket de cliente
Traduz nome de
hospedeiro ao
endereo IP
usando DNS
class clienteUDP {
public static void main(String args[]) throws Exception
{
BufferedReader do Usuario=
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket socketCliente = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName(nomeHosp");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String frase = doUsuario.readLine();
sendData = frase.getBytes();
2: Camada de Aplicao
25
DatagramPacket pacoteEnviado =
new DatagramPacket(dadosEnvio, dadosEnvio.length,
IPAddress, 9876);
socketCliente.send(pacoteEnviado);
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 Aplicao
26
Servidor UDP
2: Camada de Aplicao
27
Cria socket
para datagramas
na porta 9876
class servidorUDP {
public static void main(String args[]) throws Exception
{
DatagramSocket socketServidor = new DatagramSocket(9876);
byte[] dadosRecebidos = new byte[1024];
byte[] dadosEnviados = new byte[1024];
while(true)
{
DatagramPacket pacoteRecebido =
new DatagramPacket(dadosRecebidos,
dadosRecebidos.length);
socketServidor.receive(pacoteRecebido);
2: Camada de Aplicao
28
Obtm endereo
IP, no. de porta
do remetente
Cria datagrama p/
enviar ao cliente
DatagramPacket pacoteEnviado =
new DatagramPacket(dadosEnviados,
dadosEnviados.length, IPAddress, porta);
Escreve
datagrama
no socket
socketServidor.send(pacoteEnviado);
}
}
2: Camada de Aplicao
29
2: Camada de Aplicao
30
Aguarda conexo
do cliente
Cria fluxo
de Entrada
Cria fluxo
de Sada
import java.io.*;
import java.net.*;
import java.util.*;
class WebServer {
public static void main(String argv[]) throws Exception
{
String requestMessageLine;
String fileName;
31
requestMessageLine = inFromClient.readLine();
StringTokenizer tokenizedLine =
new StringTokenizer(requestMessageLine);
if (tokenizedLine.nextToken().equals("GET")){
fileName = tokenizedLine.nextToken();
if (fileName.startsWith("/") == true )
fileName = fileName.substring(1);
File file = new File(fileName);
int numOfBytes = (int) file.length();
32
outToClient.writeBytes(
"HTTP/1.0 200 Document Follows\r\n");
if (fileName.endsWith(".jpg"))
outToClient.writeBytes("Content-Type: image/jpeg\r\n");
if (fileName.endsWith(".gif"))
outToClient.writeBytes("Content-Type:
image/gif\r\n");
outToClient.writeBytes("Content-Length: " + numOfBytes +
"\r\n");
outToClient.writeBytes("\r\n");
Transmisso do
cabealho da resposta
HTTP.
outToClient.write(fileInBytes, 0, numOfBytes);
connectionSocket.close();
}
else System.out.println("Bad Request Message");
}
}
2: Camada de Aplicao
33
Captulo 2: Resumo
Terminamos nosso estudo de aplicaes de rede!
Requisitos do servio
de aplicao:
confiabilidade, banda,
retardo
paradigma cliente-
servidor
modelo de servio do
transporte orientado a
conexo, confivel da
Internet: TCP
no confivel,
datagramas: UDP
Protocolos especficos:
http
ftp
smtp, pop3
dns
programao c/ sockets
implementao
cliente/servidor
usando sockets tcp, udp
2: Camada de Aplicao
34
Captulo 2: Resumo
Mais importante: aprendemos sobre protocolos
troca tpica de
mensagens
pedido/resposta:
formatos de mensagens:
cabealhos: campos com
info sobre dados
(metadados)
dados: info sendo
comunicada
2: Camada de Aplicao
35