Redes de computadores Prof Nelson Fonseca 2 Camada

  • Slides: 36
Download presentation
Redes de computadores Prof. Nelson Fonseca 2: Camada de Aplicação 1

Redes de computadores Prof. Nelson Fonseca 2: Camada de Aplicação 1

DNS: Domain Name System Pessoas: muitos identificadores: ü CPF, nome, no. da Identidade hospedeiros,

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) ü note: função imprescindível da Internet implementada como protocolo de camada de aplicação ü complexidade na borda da rede 2: Camada de Aplicação 2

DNS Ø Roda sobre UDP e usa a porta 53 Ø Especificado nas RFCs

DNS Ø Roda sobre UDP e usa a porta 53 Ø Especificado nas RFCs 1034 e 1035 e atualizado em outras RFCs. Ø Outros serviços: ü apelidos para hospedeiros (aliasing) ü apelido para o servidor de mails ü distribuição da carga 2: Camada de Aplicação 3

Servidores de nomes DNS Por que não centralizar o Ø Nenhum servidor mantém todos

Servidores de nomes DNS Por que não centralizar o Ø Nenhum servidor mantém todos os mapeamento nome. DNS? para-endereço IP Ø ponto único de falha servidor de nomes local: Ø volume de tráfego ü cada provedor, empresa tem Ø base de dados servidor de nomes local (default) centralizada e distante ü pedido DNS de hospedeiro vai primeiro ao servidor de nomes Ø manutenção (da BD) 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 4

DNS: Servidores raiz Ø procurado por servidor local que não consegue resolver o nome

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 5

Exemplo simples do DNS hospedeiro manga. ic. uff. br requer endereço IP de www.

Exemplo simples do DNS hospedeiro manga. ic. uff. br requer endereço IP de www. cs. columbia. edu servidor de nomes raiz 2 5 3 4 1. Contata servidor DNS local, pitomba. ic. uff. br servidor oficial servidor local 2. pitomba. ic. uff. br cs. columbia. edu contata servidor raiz, se 1 6 necessário 3. Servidor raiz contata servidor oficial cs. columbia. edu, se solicitante www. cs. columbia. edu manga. ic. uff. br necessário 2: Camada de Aplicação 6

Exemplo de DNS Servidor raiz: Ø pode não conhecer o servidor de nomes oficial

Exemplo de DNS Servidor raiz: Ø pode não conhecer o servidor de nomes oficial Ø pode conhecer servidor de nomes intermediário: a quem contatar para descobrir o servidor de nomes oficial servidor de nomes raiz 6 2 7 3 servidor intermediário 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 Aplicação 7

DNS: consultas interativas consulta recursiva: Ø transfere a responsabilidade de resolução do nome para

DNS: consultas interativas consulta recursiva: Ø transfere a responsabilidade de resolução do nome para o servidor de nomes contatado Ø carga pesada? consulta interativa: 2 consulta interativa 3 4 7 servidor intermediário pitomba. ic. uff. br saell. cc. columbia. edu 5 6 1 8 servidor local Ø 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 raíz solicitante servidor oficial cs. columbia. edu manga. ic. uff. br www. cs. columbia. edu 2: Camada de Aplicação 8

DNS: uso de cache, atualização de dados Ø uma vez que um servidor qualquer

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 9

Registros DNS: BD distribuído contendo registros de recursos (RR) formato RR: (nome, valor, tipo,

Registros 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) Ø Tipo=MX ü valor é endereço IP de ü nome é domínio servidor oficial de nomes ü valor é nome do servidor de para este domínio correio para este domínio 2: Camada de Aplicação 10

DNS: protocolo e mensagens protocolo DNS: mensagens de pedido e resposta, ambas com o

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 11

DNS: protocolo e mensagens campos de nome, e de tipo num pedido RRs em

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 12

Programação com sockets Meta: aprender a construir aplicações cliente/servidor que se comunicam usando sockets

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 BSD 4. 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) 2: Camada de Aplicação 13

Programação com sockets usando TCP Socket: uma porta entre o processo de aplicação e

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 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 2: Camada de Aplicação 14

Programação com sockets usando TCP Cliente deve contactar servidor Ø Quando cliente cria socket:

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

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

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

Exemplo de aplicação cliente-servidor Ø servidor lê linha do socket Ø servidor converte linha

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

Interações cliente/servidor usando o TCP Servidor (executa em nome. Hosp) Cliente cria socket, porta=x,

Interações cliente/servidor usando o TCP Servidor (executa em nome. Hosp) Cliente cria socket, porta=x, para receber pedido: socket. Recepção = Server. Socket () aguarda chegada de setup pedido de conexão socket. Conexão = socket. Recepção. accept() lê pedido de socket. Conexão escreve resposta para socket. Conexão fecha socket. Conexão TCP da conexão cria socket, abre conexão a nome. Hosp, porta=x socket. Cliente = Socket() Envia pedido usando socket. Cliente lê resposta de socket. Cliente fecha socket. Cliente 2: Camada de Aplicação 18

Exemplo: cliente Java (TCP) import java. io. *; import java. net. *; class Cliente.

Exemplo: cliente Java (TCP) import java. io. *; import java. net. *; class Cliente. TCP { public static void main(String argv[]) throws Exception { String frase; String frase. Modificada; Cria fluxo de entrada Cria socket de cliente, conexão ao servidor Cria fluxo de saída ligado ao socket Buffered. Reader do. Usuario = new Buffered. Reader(new Input. Stream. Reader(System. in)); Socket socket. Cliente = new Socket(”nome. Hosp", 6789); Data. Output. Stream para. Servidor = new Data. Output. Stream(socket. Cliente. get. Output. Stream()); 2: Camada de Aplicação 19

Exemplo: cliente Java (TCP), cont. Cria fluxo de entrada ligado ao socket Buffered. Reader

Exemplo: cliente Java (TCP), cont. Cria fluxo de entrada ligado ao socket Buffered. Reader do. Servidor = new Buffered. Reader(new Input. Stream. Reader(socket. Cliente. get. Input. Stream())); frase = do. Usuario. read. Line(); Envia linha ao servidor para. Servidor. write. Bytes(frase + 'n'); frase. Modificada = do. Servidor. read. Line(); Lê linha do servidor System. out. println(”Do Servidor: " + frase. Modificada); socket. Cliente. close(); } } 2: Camada de Aplicação 20

Exemplo: servidor Java (TCP) import java. io. *; import java. net. *; class servidor.

Exemplo: servidor Java (TCP) import java. io. *; import java. net. *; class servidor. TCP { 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 frase. Cliente; Stringf. Frase. Maiusculas; Server. Socket socket. Recepcao = new Server. Socket(6789); while(true) { Socket socket. Conexao = socket. Recepcao. accept(); Buffered. Reader do. Cliente = new Buffered. Reader(new Input. Stream. Reader(socket. Conexao. get. Input. Stream())); 2: Camada de Aplicação 21

Exemplo: servidor Java (TCP), cont Cria fluxo de saída, ligado ao socket Data. Output.

Exemplo: servidor Java (TCP), cont Cria fluxo de saída, ligado ao socket Data. Output. Stream para. Cliente = new Data. Output. Stream(socket. Conexão. get. Output. Stream()); Lê linha do socket frase. Cliente= do. Cliente. read. Line(); frase. Em. Maiusculas= frase. Cliente. to. Upper. Case() + 'n'; Escreve linha ao socket para. Client. write. Bytes(frase. Em. Maiusculas); } } } Final do elo while, volta ao início e aguarda conexão de outro cliente 2: Camada de Aplicação 22

Programação com sockets usando UDP: não tem “conexão” entre cliente e servidor Ø não

Programação com sockets usando 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 2: Camada de Aplicação 23

Interações cliente/servidor usando o UDP Servidor (executa em nome. Hosp) cria socket, porta=x, para

Interações cliente/servidor usando o UDP Servidor (executa em nome. Hosp) cria socket, porta=x, para pedido que chega: socket. Servidor = Datagram. Socket() lê pedido do socket. Servidor escreve resposta ao socket. Servidor especificando endereço IP, número de porta do cliente Cliente cria socket, socket. Cliente = Datagram. Socket() cria, endereça (nome. Hosp, porta=x, envia pedido em datagrama usando socket. Cliente lê resposa do socket. Cliente fecha socket. Cliente 2: Camada de Aplicação 24

Cliente UDP 2: Camada de Aplicação 25

Cliente UDP 2: Camada de Aplicação 25

Exemplo: cliente Java (UDP) import java. io. *; import java. net. *; Cria fluxo

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 cliente. UDP { public static void main(String args[]) throws Exception { Buffered. Reader do Usuario= new Buffered. Reader(new Input. Stream. Reader(System. in)); Datagram. Socket socket. Cliente = new Datagram. Socket(); Inet. Address IPAddress = Inet. Address. get. By. Name(”nome. Hosp"); byte[] send. Data = new byte[1024]; byte[] receive. Data = new byte[1024]; String frase = do. Usuario. read. Line(); send. Data = frase. get. Bytes(); 2: Camada de Aplicação 26

Exemplo: cliente Java (UDP) cont. Cria datagrama com dados para enviar, comprimento, endereço IP,

Exemplo: cliente Java (UDP) cont. Cria datagrama com dados para enviar, comprimento, endereço IP, porta Envia datagrama ao servidor Datagram. Packet pacote. Enviado = new Datagram. Packet(dados. Envio, dados. Envio. length, IPAddress, 9876); socket. Cliente. send(pacote. Enviado); Datagram. Packet pacote. Recebido = new Datagram. Packet(dados. Recebidos, dados. Recebidos. length); Lê datagrama do servidor socket. Cliente. receive(pacote. Recebido); String frase. Modificada = new String(pacote. Recebido. get. Data()); System. out. println(”Do Servidor: " + frase. Modificada); socket. Cliente. close(); } } 2: Camada de Aplicação 27

Servidor UDP 2: Camada de Aplicação 28

Servidor UDP 2: Camada de Aplicação 28

Exemplo: servidor Java (UDP) import java. io. *; import java. net. *; Cria socket

Exemplo: servidor Java (UDP) import java. io. *; import java. net. *; Cria socket para datagramas na porta 9876 class servidor. UDP { public static void main(String args[]) throws Exception { Datagram. Socket socket. Servidor = new Datagram. Socket(9876); byte[] dados. Recebidos = new byte[1024]; byte[] dados. Enviados = new byte[1024]; Aloca memória para receber datagrama Recebe datagrama while(true) { Datagram. Packet pacote. Recebido = new Datagram. Packet(dados. Recebidos, dados. Recebidos. length); socket. Servidor. receive(pacote. Recebido); 2: Camada de Aplicação 29

Exemplo: servidor Java (UDP), cont String frase = new String(pacote. Recebido. get. Data()); Obtém

Exemplo: servidor Java (UDP), cont String frase = new String(pacote. Recebido. get. Data()); Obtém endereço IP, no. de porta do remetente Inet. Address IPAddress = pacote. Recebido. get. Address(); int porta = pacote. Recebido. get. Port(); String frase. Em. Maiusculas = frase. to. Upper. Case(); dados. Enviados = frase. Em. Maiusculas. get. Bytes(); Cria datagrama p/ enviar ao cliente Escreve datagrama no socket } Datagram. Packet pacote. Enviado = new Datagram. Packet(dados. Enviados, dados. Enviados. length, IPAddress, porta); socket. Servidor. send(pacote. Enviado); } } Fim do elo while, volta ao início e aguarda chegar outro datagrama 2: Camada de Aplicação 30

Servidor Web Simples Ø Funções do servidor Web: ü Trata apenas um pedido HTTP

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 31

Servidor Web Simples Contém a classe String. Tokenizer que é usada para examinar o

Servidor Web Simples Contém a classe String. Tokenizer que é usada para examinar o pedido Primeira linha da mensagem de pedido HTTP e Nome do arquivo solicitado Aguarda conexão do cliente import java. io. *; import java. net. *; import java. util. *; class Web. Server { public static void main(String argv[]) throws Exception { String request. Message. Line; String file. Name; Server. Socket listen. Socket = new Server. Socket(6789); Socket connection. Socket = listen. Socket. accept(); Cria fluxo de Entrada Buffered. Reader in. From. Client = new Buffered. Reader(new Input. Stream. Reader( connection. Socket. get. Input. Stream())); Cria fluxo de Saída Data. Output. Stream out. To. Client = new Data. Output. Stream( connection. Socket. get. Output. Stream()); 2: Camada de Aplicação 32

Servidor Web Simples, cont Lê a primeira linha do pedido HTTP que deveria ter

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 in. File ao arquivo file. Name Determina o tamanho do arquivo e constrói um vetor de bytes do mesmo tamanho request. Message. Line = in. From. Client. read. Line(); String. Tokenizer tokenized. Line = new String. Tokenizer(request. Message. Line); if (tokenized. Line. next. Token(). equals("GET")){ file. Name = tokenized. Line. next. Token(); if (file. Name. starts. With("/") == true ) file. Name = file. Name. substring(1); File file = new File(file. Name); int num. Of. Bytes = (int) file. length(); File. Input. Stream in. File = new File. Input. Stream ( file. Name); byte[] file. In. Bytes = new byte[]; in. File. read(file. In. Bytes); 2: Camada de Aplicação 33

Servidor Web Simples, cont Inicia a construção da mensagem de resposta out. To. Client.

Servidor Web Simples, cont Inicia a construção da mensagem de resposta out. To. Client. write. Bytes( "HTTP/1. 0 200 Document Followsrn"); if (file. Name. ends. With(". jpg")) out. To. Client. write. Bytes("Content-Type: image/jpegrn"); if (file. Name. ends. With(". gif")) out. To. Client. write. Bytes("Content-Type: image/gifrn"); out. To. Client. write. Bytes("Content-Length: " + num. Of. Bytes + "rn"); out. To. Client. write. Bytes("rn"); Transmissão do cabeçalho da resposta HTTP. out. To. Client. write(file. In. Bytes, 0, num. Of. Bytes); connection. Socket. close(); } else System. out. println("Bad Request Message"); } } 2: Camada de Aplicação 34

Capítulo 2: Resumo Terminamos nosso estudo de aplicações de rede! Ø Requisitos do serviço

Capítulo 2: Resumo Terminamos nosso estudo de aplicações de rede! Ø Requisitos do serviço de aplicação: ü confiabilidade, banda, retardo Ø paradigma cliente- servidor Ø modelo de serviço do transporte orientado a conexão, confiável da Internet: TCP ü não confiável, datagramas: UDP Ø Protocolos específicos: ü http ü ftp ü smtp, pop 3 ü dns Ø programação c/ sockets ü implementação cliente/servidor ü usando sockets tcp, udp 2: Camada de Aplicação 35

Capítulo 2: Resumo Mais importante: aprendemos sobre protocolos Ø troca típica de mensagens pedido/resposta:

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 X dados na banda, fora da banda centralizado X descentralizado s/ estado X c/ estado transferência de msgs confiável X não confiável “complexidade na borda da rede” segurança: autenticação ü Ø Ø Ø 2: Camada de Aplicação 36