cap 2 p 2 - Midiacom

Propaganda
Capítulo 2: Roteiro
 2.1 Princípios dos
protocolos da camada
de aplicação
 2.2 Web e HTTP
 2.3 FTP
 2.4 Correio Eletrônico

SMTP, POP3, IMAP
 2.5 DNS
 2.6 Compartilhamento
de arquivos P2P
 2.7 Programação de
Sockets com TCP
 2.8 Programação de
Sockets com UDP
 2.9 Construindo um
servidor Web
2b: Camada de Aplicação
1
DNS: Domain Name System
Pessoas: muitos
identificadores:

CPF, nome, no. da
Identidade
hospedeiros, roteadores
Internet :


endereço IP (32 bit) usado p/ endereçar
datagramas
“nome”, ex.,
jambo.ic.uff.br - usado
por gente
P: como mapear entre
nome e endereço IP?
Domain Name System:
 base de dados distribuída
implementada na hierarquia de
muitos servidores de nomes
 protocolo de camada de
aplicação permite que
hospedeiros, roteadores,
servidores de nomes se
comuniquem para resolver nomes
(tradução endereço/nome)
 nota: função imprescindível
da Internet implementada
como protocolo de camada de
aplicação
 complexidade na borda da
rede
2b: Camada de Aplicação
2
DNS (cont.)
Serviços DNS
 Tradução de nome de
hospedeiro para IP
 Apelidos para
hospedeiros (aliasing)

Nomes canônicos e apelidos
 Apelidos para
servidores de e-mail
 Distribuição de carga

Servidores Web replicados:
conjunto de endereços IP
para um nome canônico
Serviços DNS
 Roda sobre UDP e usa a
porta 53


RFCs 1034, 1035
Atualizado em outras RFCs
Por que não centralizar o
DNS?
 ponto único de falha
 volume de tráfego
 base de dados
centralizada e distante
 manutenção (da BD)
Não é escalável!
2b: Camada de Aplicação
3
Base de Dados Hierárquica e
Distribuída
Root DNS Servers
com DNS servers
yahoo.com
amazon.com
DNS servers DNS servers
org DNS servers
pbs.org
DNS servers
edu DNS servers
poly.edu
DNS servers
umass.edu
DNS servers
Cliente quer IP para www.amazon.com; 1a aprox:
 Cliente consulta um servidor raiz para encontrar um
servidor DNS .com
 Cliente consulta servidor DNS .com para obter o
servidor DNS para o domínio amazon.com
 Cliente consulta servidor DNS do domínio amazon.com
para obter endereço IP de www.amazon.com
2b: Camada de Aplicação
4
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
a Verisign, Dulles, VA
c Cogent, Herndon, VA (also Los Angeles)
d U Maryland College Park, MD
k RIPE London (also Amsterdam,
g US DoD Vienna, VA
Frankfurt)
h ARL Aberdeen, MD
i
Autonomica, Stockholm
j Verisign, ( 11 locations)
(plus 3 other locations)
m WIDE Tokyo
e NASA Mt View, CA
f Internet Software C. Palo Alto,
CA (and 17 other locations)
b USC-ISI Marina del Rey, CA
l ICANN Los Angeles, CA
13 servidores de
nome raiz em
todo o mundo
2b: Camada de Aplicação
5
Servidores TLD e Oficiais
 Servidores Top-level domain (TLD) : servidores DNS
responsáveis por domínios com, org, net, edu, etc, e
todos os domínios de países como br, uk, fr, ca, jp.


Network Solutions mantém servidores para domínio com
FAPESP (Registro .br) para domínio br
 Servidores oficiais: servidores DNS das
organizações, provendo mapeamentos oficiais entre
nomes de hospedeiros e endereços IP para os
servidores da organização (e.x., Web e correio).

Podem ser mantidos pelas organizações ou pelo provedor de
acesso
2b: Camada de Aplicação
6
Servidor de Nomes Local
 Não pertence necessariamente à hierarquia
 Cada ISP (ISP residencial, companhia,
universidade) possui um.

Também chamada do “servidor de nomes
default”
 Quanto um hospedeiro faz uma consulta
DNS, a mesma é enviada para o seu
servidor DNS local

Atua como um intermediário, enviando consultas
para a hierarquia.
2b: Camada de Aplicação
7
Exemplo de DNS
servidor raiz
 Hospedeiro em
cis.poly.edu quer
endereço IP para
gaia.cs.umass.edu
2
3
servidor TLD
4
5
servidor local
dns.poly.edu
1
8
7
6
servidor oficial
dns.cs.umass.edu
solicitante
cis.poly.edu
gaia.cs.umass.edu
2b: Camada de Aplicação
8
DNS: tipos de consultas
consulta recursiva:
 transfere a
responsabilidade de
resolução do nome
para o servidor de
nomes contatado
 carga pesada?
consulta interativa:
 servidor consultado
responde com o nome
de um servidor de
contato
 “Não conheço este
nome, mas pergunte
para esse servidor”
servidor de
nomes raiz
consulta
interativa
servidor TLD
2
3
4
6
servidor local
pitomba.ic.uff.br
consulta
recursiva
5
servidor
intermediário
9
saell.cc.columbia.edu
8
1
7
10
servidor oficial
cs.columbia.edu
solicitante
manga.ic.uff.br
www.cs.columbia.edu
2b: Camada de Aplicação
9
DNS: uso de cache, atualização de dados
 uma vez que um servidor qualquer aprende um
mapeamento, ele o coloca numa cache local
 entradas na cache são sujeitas a temporização
(desaparecem depois de um certo tempo)
 Servidores TLD tipicamente armazenados no
cache dos servidores de nomes locais
• Servidores raiz acabam não sendo visitados com
muita freqüência
 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
2b: Camada de Aplicação
10
Registros DNS
DNS: BD distribuído contendo registros de recursos (RR)
formato RR: (nome,
valor, tipo, sobrevida)
 Tipo=CNAME
 Tipo=A
 nome é nome alternativo
 nome é nome de hospedeiro
(alias) para algum nome
 valor é o seu endereço IP
“canônico” (verdadeiro)
 Tipo=NS
 valor é o nome
 nome é domínio (p.ex.
canônico
foo.com.br)

valor é endereço IP de
servidor oficial de nomes
para este domínio
 Tipo=MX
 nome é domínio
 valor é nome do servidor de
correio para este domínio
2b: Camada de Aplicação
11
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
2b: Camada de Aplicação
12
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
2b: Camada de Aplicação
13
Inserindo registros no DNS
 Exemplo: acabou de cria a empresa “Network Utopia”
 Registra o nome netutopia.com.br em uma entidade
registradora (e.x., Registro .br)


Tem de prover para a registradora os nomes e endereços IP
dos servidores DNS oficiais (primário e secundário)
Registradora insere dois RRs no servidor TLD .br:
(netutopia.com.br, dns1.netutopia.com.br, NS)
(dns1.netutopia.com.br, 212.212.212.1, A)
 Põe no servidor oficial um registro do tipo A para
www.netutopia.com.br e um registro do tipo MX para
netutopia.com.br
 Como as pessoas vão obter o endereço IP do seu
site?
2b: Camada de Aplicação
14
Capítulo 2: Roteiro
 2.1 Princípios dos
protocolos da camada
de aplicação
 2.2 Web e HTTP
 2.3 FTP
 2.4 Correio Eletrônico

SMTP, POP3, IMAP
 2.5 DNS
 2.6 Compartilhamento
de arquivos P2P
 2.7 Programação de
Sockets com TCP
 2.8 Programação de
Sockets com UDP
 2.9 Construindo um
servidor Web
2b: Camada de Aplicação
15
Compartilhamento de arquivos
P2P
 Alice escolhe um dos
Exemplo
 Alice executa aplicação
cliente P2P no seu notebook
 Periodicamente ela se
conecta à Internet e
recebe um novo endereço
IP a cada conexão
 Pede a música “Hey Jude”
 A aplicação apresenta uma
lista de outros parceiros
que possuem uma cópia de
Hey Jude.
parceiros, Bob.
 O arquivo é copiado do PC
de Bob para o notebook de
Alice: HTTP
 Enquanto Alice está
baixando a música, outros
usuários podem estar
pegando arquivos do seu
computador.
 O parceiro de Alice é tanto
um cliente Web como um
servidor Web temporário.
Todos os parceiros são
servidores = altamente
escalável!
2b: Camada de Aplicação
16
P2P: diretório centralizado
Projeto original do
Napster
Bob
servidor de diretório
centralizado
1
1) Quando um parceiro
conecta ele informa ao
servidor central o seu:


endereço IP
conteúdo
2) Alice consulta sobre a
música “Hey Jude”
3) Alice solicita o arquivo a
Bob
parceiros
1
3
1
2
1
Alice
2b: Camada de Aplicação
17
P2P: problemas com diretório
centralizado
 Ponto único de falha
 Gargalo de
desempenho
 Violação de Direitos
Autorais
a transferência de arquivo
é descentralizada, mas a
localização do conteúdo é
altamente centralizada.
2b: Camada de Aplicação
18
Inundação de consultas: Gnutella
 Completamente
distribuído

Sem servidor central
 Protocolo de domínio
público
 Vários clientes
Gnutella implementam
o protocolo
Rede sobreposta: grafo
 Arco entre pares X e Y se
existe uma conexão TCP
 Todos os pares ativos e
arcos formam a rede
sobreposta
 Arco não é um enlace
físico
 Um par vai estar
conectado tipicamente
com < 10 vizinhos na rede
sobreposta
2b: Camada de Aplicação
19
Gnutella: protocolo
 Mensagem de
consulta enviada
pelas conexões TCP
existentes
 Pares repassem
mensagem de
consulta
 Resposta sobre
item encontrado
enviada pelo
caminho reverso
Transferência arq:
HTTP
Consulta
Item achado
Consulta
Item achado
Escalabilidade:
Inundação com
escopo limitado
2b: Camada de Aplicação
20
Gnutella: junção do Par
Um par X se juntando deve encontrar algum outro
par na rede Gnutella: usa lista de pares
candidatos
2. X tenta criar conexões TCP com os pares na lista
seqüencialmente até estabelecer conexão com Y
3. X envia mensagem Ping para Y; Y repassa a
mensagem Ping
4. Todos os pares recebendo a mensagem Ping
respondem com uma mensagem Pong
5. X recebe várias mensagens Pong. Ele pode então
estabelecer conexões TCP adicionais
Saída do par: veja problema no livro texto!
1.
2b: Camada de Aplicação
21
Explorando heterogeneidade:
KaZaA
 Cada parceiro é um
líder de grupo ou está
alocado a um líder de
grupo


Conexão TCP entre cada
par e o seu líder de
grupo
Conexões TCP entre
alguns pares de líderes
de grupos
 O líder de um grupo
mantém registro sobre
o conteúdo de todos os
seus filhos
ordinary peer
group-leader peer
neighoring relationships
in overlay network
2b: Camada de Aplicação
22
KaZaA: Consulta
 Cada arquivo possui um hash e um descritor
 O cliente envia palavras-chave para o seu líder de
grupo
 O líder de grupo responde com os itens
encontrados

Para cada item: metadados, hash, endereço IP
 Se o líder de grupo repassa a consulta para outros
líderes, eles respondem com os itens encontrados
 O cliente seleciona arquivos para download

Requisições HTTP usando hash com identificador são
enviadas para os pares que possuem os arquivos desejado
2b: Camada de Aplicação
23
Truques do KaZaA
 Limitações na quantidade de uploads
simultâneos
 Enfileiramento de requisições
 Prioridades para incentivar disponibilização
de conteúdo
 Download em paralelo
2b: Camada de Aplicação
24
Capítulo 2: Roteiro
 2.1 Princípios dos
protocolos da camada
de aplicação
 2.2 Web e HTTP
 2.3 FTP
 2.4 Correio Eletrônico

SMTP, POP3, IMAP
 2.5 DNS
 2.6 Compartilhamento
de arquivos P2P
 2.7 Programação de
Sockets com TCP
 2.8 Programação de
Sockets com UDP
 2.9 Construindo um
servidor Web
2b: Camada de Aplicação
25
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
em 1981
 são explicitamente criados,
usados e liberados por apls
 paradigma cliente/servidor
 dois tipos de serviço de
transporte via API Sockets


datagrama não confiável
fluxo de bytes, confiável
“porta”), local ao
hospedeiro, criada por e
pertencente à aplicação, e
controlado pelo SO,
através da qual um
processo de aplicação
pode tanto enviar como
receber mensagens
para/de outro processo
de aplicação
(remoto ou local)
2b: Camada de Aplicação
26
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
programador de
aplicação
controlado
pelo sistema
operacional
processo
processo
socket
TCP com
buffers,
variáveis
estação ou
servidor
internet
socket
TCP com
buffers,
variáveis
controlado pelo
programador de
aplicação
controlado
pelo sistema
operacional
estação ou
servidor
2b: Camada de Aplicação
27
Programação com sockets usando TCP
Cliente deve contactar servidor  Quando contatado pelo cliente, o
TCP do servidor cria socket novo
 processo servidor deve antes
para que o processo servidor possa
estar em execução
se comunicar com o cliente
 servidor deve antes ter
 permite que o servidor
criado socket (porta) que
converse com múltiplos clientes
aguarda contato do cliente
 Endereço IP e porta origem
Cliente contacta servidor para:
são usados para distinguir os
 criar socket TCP local ao
clientes (mais no cap. 3)
cliente
 especificar endereço IP,
número de porta do processo
ponto de vista da aplicação
servidor
TCP provê transferência
 Quando cliente cria socket:
confiável, ordenada de bytes
TCP cliente cria conexão com
(“tubo”) entre cliente e servidor
TCP do servidor
2b: Camada de Aplicação
28
Comunicação entre sockets
2b: Camada de Aplicação
29
Jargão para Fluxo (Stream)
 Um fluxo (stream) é uma
seqüência de caracteres
que fluem de ou para um
processo.
 Um fluxo de entrada é
conectado a alguma fonte
de entrada para o processo,
por exemplo, teclado ou
socket.
 Um fluxo de saída é
conectado a uma fonte de
saída, por exemplo, um
monitor ou um socket.
2b: Camada de Aplicação
30
Programação com sockets usando TCP
2.
3.
4.
cliente lê linha da entrada
padrão (fluxo doUsuário),
envia para servidor via
socket (fluxo
paraServidor)
servidor lê linha do socket
servidor converte linha para
letras maiúsculas, devolve
para o cliente
cliente lê linha modificada do
socket (fluxo doServidor),
imprime-a
input
stream
Processo
Process
cliente
Fluxo de saída:
Seqüência de bytes
transmitidos pelo
processo
output
stream
monitor
Fluxo de entrada:
Seqüência de
bytes recebidos
pelo processo
inFromServer
1.
outToServer
Exemplo de apl. clienteservidor:
inFromUser
keyboard
input
stream
Socket
clientSocket
cliente TCP
to network
TCP
socket
from network
2b: Camada de Aplicação
31
Interações cliente/servidor usando o TCP
Servidor (executa em nomeHosp)
Cliente
cria socket,
porta=x, para
receber pedido:
socketRecepção =
ServerSocket ()
aguarda chegada de
setup
pedido de conexão
socketConexão =
socketRecepção.accept()
lê pedido de
socketConexão
escreve resposta
para socketConexão
fecha
socketConexão
TCP
da conexão
cria socket,
abre conexão a nomeHosp, porta=x
socketCliente =
Socket()
Envia pedido usando
socketCliente
lê resposta de
socketCliente
fecha
socketCliente
2b: Camada de Aplicação
32
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
Cria
socket de cliente,
conexão ao servidor
Cria
fluxo de saída
ligado ao socket
BufferedReader doUsuario =
new BufferedReader(new InputStreamReader(System.in));
Socket socketCliente = new Socket(”nomeHosp", 6789);
DataOutputStream paraServidor =
new DataOutputStream(socketCliente.getOutputStream());
2b: Camada de Aplicação
33
Exemplo: cliente Java (TCP), cont.
Cria
fluxo de entrada
ligado ao socket
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();
}
}
2b: Camada de Aplicação
34
Exemplo: servidor Java (TCP)
import java.io.*;
import java.net.*;
class servidorTCP {
Cria socket
para recepção
na porta 6789
Aguarda, no socket
para recepção, o
contato do cliente
Cria fluxo de
entrada, ligado
ao socket
public static void main(String argv[]) throws Exception
{
String fraseCliente;
StringfFraseMaiusculas;
ServerSocket socketRecepcao = new ServerSocket(6789);
while(true) {
Socket socketConexao = socketRecepcao.accept();
BufferedReader doCliente =
new BufferedReader(new
InputStreamReader(socketConexao.getInputStream()));
2b: Camada de Aplicação
35
Exemplo: servidor Java (TCP), cont
Cria fluxo
de saída, ligado
ao socket
DataOutputStream paraCliente =
new DataOutputStream(socketConexão.getOutputStream());
Lê linha
do socket
fraseCliente= doCliente.readLine();
fraseEmMaiusculas= fraseCliente.toUpperCase() + '\n';
Escreve linha
ao socket
paraClient.writeBytes(fraseEmMaiusculas);
}
}
}
Final do laço while,
volta ao início e aguarda
conexão de outro cliente
2b: Camada de Aplicação
36
Capítulo 2: Roteiro
 2.1 Princípios dos
protocolos da camada
de aplicação
 2.2 Web e HTTP
 2.3 FTP
 2.4 Correio Eletrônico

SMTP, POP3, IMAP
 2.5 DNS
 2.6 Compartilhamento
de arquivos P2P
 2.7 Programação de
Sockets com TCP
 2.8 Programação de
Sockets com UDP
 2.9 Construindo um
servidor Web
2b: Camada de Aplicação
37
Programação com sockets usando UDP
UDP: não tem “conexão” entre
cliente e servidor
 não tem “handshaking”
 remetente coloca
explicitamente endereço IP
e porta do destino
 servidor deve extrair
endereço IP, porta do
remetente do datagrama
recebido
ponto de vista da aplicação
UDP provê transferência
não confiável de grupos
de bytes (“datagramas”)
entre cliente e servidor
UDP: dados transmitidos
podem ser recebidos fora
de ordem, ou perdidos
2b: Camada de Aplicação
38
Interações cliente/servidor usando o UDP
Servidor (executa em nomeHosp)
cria socket,
porta=x, para
pedido que chega:
socketServidor =
DatagramSocket()
lê pedido do
socketServidor
escreve resposta
ao socketServidor
especificando endereço
IP, número de porta
do cliente
Cliente
cria socket,
socketCliente =
DatagramSocket()
cria, endereça (nomeHosp, porta=x,
envia pedido em datagrama
usando socketCliente
lê resposta do
socketCliente
fecha
socketCliente
2b: Camada de Aplicação
39
Exemplo: Cliente Java (UDP)
input
stream
Processo
cliente
monitor
inFromUser
keyboard
Process
Entrada: recebe
UDP
packet
receivePacket
pacote (o TCP
enviou uma
“seqüência de
bytes”)
sendPacket
Saída: transmite
UDP
packet
socket
cliente UDP
pacote (o TCP
recebeu uma
“seqüência de
bytes”)
clientSocket
to network
UDP
socket
from network
2b: Camada de Aplicação
40
Exemplo: cliente Java (UDP)
import java.io.*;
import java.net.*;
Cria
fluxo de entrada
Cria
socket de cliente
Traduz nome de
hospedeiro ao
endereço IP
usando DNS
class clienteUDP {
public static void main(String args[]) throws Exception
{
BufferedReader doUsuario=
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket socketCliente = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName(”nomeHosp");
byte[] dadosEnvio = new byte[1024];
byte[] dadosRecebidos = new byte[1024];
String frase = doUsuario.readLine();
dadosEnvio = frase.getBytes();
2b: Camada de Aplicação
41
Exemplo: cliente Java (UDP) cont.
Cria datagrama com
dados para enviar,
comprimento,
endereço IP, porta
Envia datagrama
ao servidor
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();
}
}
2b: Camada de Aplicação
42
Servidor UDP
2b: Camada de Aplicação
43
Exemplo: servidor Java (UDP)
import java.io.*;
import java.net.*;
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];
Aloca memória para
receber datagrama
Recebe
datagrama
while(true)
{
DatagramPacket pacoteRecebido =
new DatagramPacket(dadosRecebidos,
dadosRecebidos.length);
socketServidor.receive(pacoteRecebido);
2b: Camada de Aplicação
44
Exemplo: servidor Java (UDP), cont
String frase = new String(pacoteRecebido.getData());
Obtém endereço
IP, no. de porta
do remetente
InetAddress IPAddress = pacoteRecebido.getAddress();
int porta = pacoteRecebido.getPort();
String fraseEmMaiusculas = frase.toUpperCase();
dadosEnviados = fraseEmMaiusculas.getBytes();
Cria datagrama p/
enviar ao cliente
DatagramPacket pacoteEnviado =
new DatagramPacket(dadosEnviados,
dadosEnviados.length, IPAddress, porta);
Escreve
datagrama
no socket
socketServidor.send(pacoteEnviado);
}
}
}
Fim do laço while,
volta ao início e aguarda
chegar outro datagrama
2b: Camada de Aplicação
45
Capítulo 2: Roteiro
 2.1 Princípios dos
protocolos da camada
de aplicação
 2.2 Web e HTTP
 2.3 FTP
 2.4 Correio Eletrônico

SMTP, POP3, IMAP
 2.5 DNS
 2.6 Compartilhamento
de arquivos P2P
 2.7 Programação de
Sockets com TCP
 2.8 Programação de
Sockets com UDP
 2.9 Construindo um
servidor Web
2b: Camada de Aplicação
46
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.

2b: Camada de Aplicação
47
Servidor Web Simples
Contém a classe
StringTokenizer que é
usada para examinar
o pedido
Primeira linha da mensagem
de pedido HTTP e
Nome do arquivo solicitado
Aguarda conexão
do cliente
Cria fluxo
de Entrada
Cria fluxo
de Saída
import java.io.*;
import java.net.*;
import java.util.*;
class WebServer {
public static void main(String argv[]) throws Exception
{
String requestMessageLine;
String fileName;
ServerSocket listenSocket = new ServerSocket(6789);
Socket connectionSocket = listenSocket.accept();
BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(
connectionSocket.getInputStream()));
DataOutputStream outToClient =
new DataOutputStream(
connectionSocket.getOutputStream());
2b: Camada de Aplicação
48
Servidor Web Simples, cont
Lê a primeira linha do
pedido HTTP que deveria
ter o seguinte formato:
GET file_name HTTP/1.0
Examina a primeira linha
da mensagem para extrair
o nome do arquivo
Associa o fluxo inFile
ao arquivo fileName
Determina o tamanho do
arquivo e constrói um vetor
de bytes do mesmo tamanho
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();
FileInputStream inFile = new FileInputStream (
fileName);
byte[] fileInBytes = new byte[];
inFile.read(fileInBytes);
2b: Camada de Aplicação
49
Servidor Web Simples, cont
Inicia a construção da
mensagem de resposta
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");
Transmissão do
cabeçalho da resposta
HTTP.
outToClient.write(fileInBytes, 0, numOfBytes);
connectionSocket.close();
}
else System.out.println("Bad Request Message");
}
}
2b: Camada de Aplicação
50
Capítulo 2: Resumo
Nosso estudo sobre aplicações de rede está agora
completo!
 Arquiteturas de aplicações
 cliente-servidor
 P2P
 híbrido
 Requerimentos de serviço
das aplicações:

 Protocolos específicos:
 HTTP
 FTP
 SMTP, POP, IMAP
 DNS
 Programação socket
confiabilidade, banda, atraso
 Modelos de serviço de
transporte da Internet


orientado à conexão,
confiável: TCP
não confiável, datagramas:
UDP
2b: Camada de Aplicação
51
Capítulo 2: Resumo
Mais importante: aprendemos sobre protocolos
 troca típica de mensagens
pedido/resposta


cliente solicita info ou serviço
servidor responde com dados,
código de status
 formatos de mensagens:


cabeçalhos: campos com info
sobre dados (metadados)
dados: info sendo comunicada
 msgs de controle vs. dados
na banda, fora da banda
centralizado vs.
descentralizado
s/ estado vs. c/ estado
transferência de msgs
confiável vs. não confiável
“complexidade na borda da
rede”





2b: Camada de Aplicação
52
Download