Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de...
Transcript of Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de...
![Page 1: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/1.jpg)
1
Capítulo 2
Camada de aplicação
![Page 2: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/2.jpg)
2
Redes de computadores I
Prof.: Leandro Soares de Sousa
E-mail: [email protected]
Site: http://www.ic.uff.br/~lsousa
Não deixem a matéria acumular!!!
Datas das avaliações, exercícios propostos, transparências,... no site!
![Page 3: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/3.jpg)
3
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 4: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/4.jpg)
4
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 5: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/5.jpg)
5
• O ponto central do desenvolvimento de aplicação de rede é escrever programas que rodem em sistemas finais diferentes e se comuniquem entre si.
• Ao desenvolver sua nova aplicação, você precisará escrever um software que rode em vários sistemas finais.
Princípios de aplicações de rede
![Page 6: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/6.jpg)
6
• Esse software poderia ser criado, por exemplo, em C, Java ou Python.
• Você não precisará escrever programas que executem nos elementos do núcleo de rede, como nos roteadores.
Princípios de aplicações de rede
![Page 7: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/7.jpg)
7
• A arquitetura de rede é fixa e provê um conjunto específico de serviços.
• A arquitetura da aplicação é projetada pelo programador e determina como a aplicação é organizada nos vários sistemas finais.
Arquiteturas de aplicação de rede
![Page 8: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/8.jpg)
8
• Em uma arquitetura cliente-servidor há um hospedeiro sempre em funcionamento, denominado servidor, que atende a requisições de muitos outros hospedeiros, denominados clientes.
• Ex.: web, e-mail, ftp, telnet, ssh, scp, …
Arquiteturas de aplicação de rede
![Page 9: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/9.jpg)
9
• A comunicação de uma aplicação de rede ocorre entre “sistemas finais” (hospedeiros) na camada de aplicação.
Arquiteturas de aplicação de rede
![Page 10: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/10.jpg)
10
• A arquitetura P2P utiliza a comunicação direta entre duplas de hospedeiros conectados alternadamente, denominados pares.
• Uma das características mais fortes da arquitetura P2P é sua autoescalabilidade.
• Compartilhamento de arquivos (BitTorrent), telefonia pela Internet (Skype), IPTV (KanKan, Ppstream, ...)
Arquiteturas de aplicação de rede
![Page 11: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/11.jpg)
11
• As futuras aplicações P2P estão diante de três principais desafios:
1. ISP Amigável: atual banda assimétrica, mas com P2P pode colocar pressão nos ISPs
2. Segurança: proteção complicada!
3. Incentivos: usuários participativos
Arquiteturas de aplicação de rede
![Page 12: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/12.jpg)
12Arquiteturas de aplicação de rede
![Page 13: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/13.jpg)
13
• Processos de aplicação, sockets e protocolo de transporte subjacente.
Comunicação entre processos
![Page 14: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/14.jpg)
14
• Uma aplicação de rede consiste em pares de processos que enviam mensagens uns para os outros por meio de uma rede.
• Um processo envia mensagens para a rede e recebe mensagens dela através de uma interface de software denominada socket.
• Para identificar o processo receptor, duas informações devem ser especificadas:
1. o endereço do hospedeiro e 2. um identificador que especifica o processo receptor no
hospedeiro de destino.
Comunicação entre processos
![Page 15: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/15.jpg)
15
• Transferência confiável de dados: a aplicação tolera perdas?
• Vazão: restrição de banda na aplicação?
• Temporização: o tempo fim-a-fim é relevante?
• Segurança: o transporte tem restrição de segurança? (cap.8)
Serviços de transporte disponíveis para aplicações
![Page 16: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/16.jpg)
16
● Serviço TCP:
● orientado a conexão: inicialização requerida entre cliente e servidor / transporte confiável entre processos remetente e receptor
● controle de fluxo: remetente não vai “afogar” receptor● controle de congestionamento: estrangular remetente quando a rede estiver
carregada● não provê: garantias temporais ou de banda mínima
● Serviço UDP:
● transferência de dados não confiável entre processos remetente e receptor● não provê: estabelecimento da conexão, confiabilidade, controle de fluxo,
controle de congestionamento, garantias temporais ou de banda mínima
Pergunta: Qual é o interesse em ter um UDP?
Serviços de transporte disponíveis para aplicações
![Page 17: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/17.jpg)
17
• A Internet disponibiliza dois protocolos de transporte para aplicações, o UDP e o TCP.
• Requisitos de aplicações de rede selecionadas:
Serviços de transporte providos pela Internet
![Page 18: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/18.jpg)
18
• Aplicações populares da Internet, seus protocolos de camada de aplicação e seus protocolos de transporte subjacentes:
Serviços de transporte providos pela Internet
![Page 19: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/19.jpg)
19
Um protocolo de camada de aplicação define:
• Os tipos de mensagens trocadas.
• A sintaxe dos vários tipos de mensagens, tais como os campos da mensagem e como os campos são delineados.
• A semântica dos campos, isto é, o significado da informação nos campos.
• Regras para determinar quando e como um processo envia mensagens e responde a mensagens.
Protocolos de camada de aplicação
![Page 20: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/20.jpg)
20
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 21: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/21.jpg)
21
• Talvez o que mais atraia a maioria dos usuários da Web é que ela funciona por demanda.
• O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada de aplicação da Web, está no coração da Web e é definido no [RFC 1945] e no [RFC 2616].
• O HTTP é executado em dois programas:
1. um cliente e 2. outro servidor.
A Web e o HTTP
![Page 22: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/22.jpg)
22
• Uma página Web é constituída de objetos.
• Um objeto é apenas um arquivo que se pode acessar com um único URL. (ex.: www.ic.uff.br/~lsousa/index.html - hospedeiro - caminho)
• A maioria das páginas Web é constituída de um arquivo-base HTML e diversos objetos referenciados.
• O HTTP usa o TCP como seu protocolo de transporte subjacente (porta 80).
• O HTTP é denominado um protocolo sem estado (stateless – vários protocolos são assim).
A Web e o HTTP
![Page 23: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/23.jpg)
23
• Mecânica do processo:
A Web e o HTTP
![Page 24: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/24.jpg)
24
• Quando a interação cliente-servidor acontece por meio de conexão TCP, o programador da aplicação precisa tomar uma importante decisão:
• Conexões não persistentes (http 1.0) — cada par de requisição/resposta deve ser enviado por uma conexão TCP distinta.
• Conexões persistentes (http 1.1) — todas as requisições e suas respostas devem ser enviadas por uma mesma conexão TCP.
Conexões persistentes e não persistentes
![Page 25: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/25.jpg)
25Conexões persistentes e não persistentes
![Page 26: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/26.jpg)
26
• Quando a interação cliente-servidor acontece por meio de conexão TCP, o programador da aplicação precisa tomar uma importante decisão:
• Conexões não persistentes (http 1.0) — cada par de requisição/resposta deve ser enviado por uma conexão TCP distinta.
• Conexões persistentes (http 1.1) — todas as requisições e suas respostas devem ser enviadas por uma mesma conexão TCP (com ou sem paralelismo – configuração no navegador).
Conexões persistentes e não persistentes
![Page 27: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/27.jpg)
27
Mensagem de requisição HTTP
• Apresentamos a seguir uma mensagem de requisição HTTP típica:
GET /somedir/page.html HTTP/1.1Host: www.someschool.eduConnection: closeUser-agent: Mozilla/5.0Accept-language: fr
Formato da mensagem HTTP
![Page 28: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/28.jpg)
28
• Formato geral de uma mensagem de requisição HTTP
Formato da mensagem HTTP
![Page 29: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/29.jpg)
29
Mensagem de resposta HTTP
• Apresentamos a seguir uma mensagem de resposta HTTP típica:
HTTP/1.1 200 OKConnection: closeDate: Tue, 09 Aug 2011 15:44:04 GMTServer: Apache/2.2.3 (CentOS)Last-Modified: Tue, 09 Aug 2011 15:11:03 GMTContent-Length: 6821Content-Type: text/html(dados dados dados dados dados ...)
Formato da mensagem HTTP
![Page 30: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/30.jpg)
30
• Formato geral de uma mensagem de resposta HTTP
Formato da mensagem HTTP
![Page 31: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/31.jpg)
31
• Na primeira linha da mensagem de resposta servidor → cliente. Alguns códigos típicos:
● 200 OK● sucesso, objeto pedido segue mais adiante nesta mensagem
● 301 Moved Permanently● objeto pedido mudou de lugar, nova localização especificado mais adiante
nesta mensagem (Location:)
● 400 Bad Request● mensagem de pedido não entendida pelo servidor
● 404 Not Found● documento pedido não se encontra neste servidor
● 505 HTTP Version Not Supported● versão de http do pedido não usada por este servidor
Formato da mensagem HTTP
![Page 32: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/32.jpg)
32
Cookies, definidos no [RFC 6265], permitem que sites monitorem seus usuários (privacidade?).
A tecnologia dos cookies tem quatro componentes:
1. uma linha de cabeçalho de cookie na mensagem de resposta HTTP;
2. uma linha de cabeçalho de cookie na mensagem de requisição HTTP;
3. um arquivo de cookie mantido no sistema final do usuário e gerenciado pelo navegador do usuário;
4. um banco de dados de apoio no site.
Interação usuário-servidor: cookies
![Page 33: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/33.jpg)
33
• Mantendo o estado do usuário com cookies.
Interação usuário-servidor: cookies
![Page 34: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/34.jpg)
34
• Um cache Web — também denominado servidor proxy — é uma entidade da rede que atende requisições HTTP em nome de um servidor Web de origem.
Clientes requisitandoobjetos por meio de um cache Web:
Caches Web
![Page 35: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/35.jpg)
35
● GET condicional – mecanismo que permite que um cache verifique se seus objetos estão atualizados.
● Meta: não enviar objeto se cliente já tem (no cache) versão atual
● cache: especifica data da cópia no cache no pedido http
If-modified-since: <date>● servidor: resposta não
contém objeto se cópia no cache é atual:
HTTP/1.0 304 Not Modified
GET condicional
![Page 36: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/36.jpg)
36
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 37: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/37.jpg)
37
• Em uma sessão FTP típica, o usuário quer transferir arquivos de ou para um hospedeiro remoto.
• HTTP e FTP são protocolos de transferência de arquivos e têm muitas características em comum.
• ftp: RFC 959
• servidor ftp: porta 21
Transferência de arquivo: FTP
![Page 38: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/38.jpg)
38
• FTP transporta arquivos entre sistemas de arquivo local e remoto:
Transferência de arquivo: FTP
![Page 39: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/39.jpg)
39
• Conexões de controle e de dados, protocolo dito “fora de banda” (texto aberto na conexão de controle):
Transferência de arquivo: FTP
![Page 40: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/40.jpg)
40
Alguns dos comandos mais comuns são descritos a seguir:
• USER username: usado para enviar identificação do usuário ao servidor.
• PASS password: usado para enviar a senha do usuário ao servidor.
• LIST: usado para pedir ao servidor que envie uma lista com todos os arquivos existentes no atual diretório remoto.
• RETR filename: usado para extrair um arquivo do diretório atual do hospedeiro remoto.
Camadas e respostas FTP
![Page 41: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/41.jpg)
41
• STOR filename: usado para armazenar um arquivo no diretório atual do hospedeiro remoto.
Algumas respostas típicas, junto com suas possíveis mensagens, são as seguintes:
• 331 Nome de usuário OK, senha requisitada
• 125 Conexão de dados já aberta; iniciando transferência
• 425 Não é possível abrir a conexão de dados
• 452 Erro ao escrever o arquivo
Camadas e respostas FTP
![Page 42: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/42.jpg)
42
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 43: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/43.jpg)
43
• Uma visão do sistema de e-mail da Internet.
• Três grandes componentes:
● agentes de usuário (UA)
● servidores de correio
● simple mail transfer protocol: SMTP
Correio eletrônico na Internet
![Page 44: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/44.jpg)
44
• Servidores de correio
● caixa de correio contém mensagens de chegada (ainda não lidas) p/ usuário
● fila de mensagens contém mensagens de saída (a serem enviadas)
● protocolo SMTP entre servidores de correio para transferir mensagens de correio
● cliente: servidor de correio que envia
● servidor: servidor de correio que recebe
Correio eletrônico na Internet
![Page 45: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/45.jpg)
45
• Usa TCP para a transferência confiável de msgs do correio do cliente ao servidor, porta 25
● transferência direta: servidor remetente ao servidor receptor
● três fases da transferência
● handshaking (cumprimento)● transferência das mensagens● encerramento
● interação comando/resposta
● comandos: texto ASCII● resposta: código e frase de status
● mensagens precisam ser em ASCII de 7-bits
SMTP (RFC 2821)
![Page 46: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/46.jpg)
46
S: 220 doces.br C: HELO consumidor.br S: 250 Hello consumidor.br, pleased to meet you C: MAIL FROM: <[email protected]> S: 250 [email protected]... Sender ok C: RCPT TO: <[email protected]> S: 250 [email protected] ... Recipient ok C: DATA S: 354 Enter mail, end with "." on a line by itself C: Voce gosta de chocolate? C: Que tal sorvete? C: . S: 250 Message accepted for delivery C: QUIT S: 221 doces.br closing connection
Interação SMTP típica
![Page 47: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/47.jpg)
47
• O SMTP transfere mensagens de servidores de correio remetentes para servidores de correio destinatários.
• O SMTP é um protocolo “push” (empurre) e o HTTP “pull” (puxe)
Alice envia uma mensagem a Bob:
SMTP
![Page 48: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/48.jpg)
48
• Um cabeçalho de mensagem típico é semelhante a:
From: [email protected]: [email protected]: Searching for the meaning of life.
• Após o cabeçalho da mensagem, vem uma linha em branco e, em seguida, o corpo da mensagem (em ASCII com 7 bits).
• Se é ASCII de 7 bits, como envio as fotos, vídeos, …? (MIME)
Formatos de mensagem de correio
![Page 49: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/49.jpg)
49
● MIME: multimedia mail extension, RFC 2045, 2056● linhas adicionais no cabeçalho da msg declaram tipo do
conteúdo MIME
Formatos de mensagem de correio: extensões multimídia
![Page 50: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/50.jpg)
50
Text● subtipos exemplos: plain, html● charset=“iso-8859-1”, ascii
Image● subtipos exemplos : jpeg, gif
Video● subtipos exemplos : mpeg, quicktime
Áudio● subtipos exemplos : basic (8-bit codificado mu-law), 32kadpcm (codificação 32
kbps)
Application● outros dados que precisam ser processados por um leitor para serem “visualizados”● subtipos exemplos : msword, octet-stream
Formatos de mensagem de correio: extensões multimídia
![Page 51: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/51.jpg)
51
Tipo Multipart:
From: [email protected] To: [email protected] Subject: Picture of yummy crepe. MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=98766789 --98766789Content-Transfer-Encoding: quoted-printableContent-Type: text/plain
Dear Bob, Please find a picture of a crepe.--98766789Content-Transfer-Encoding: base64Content-Type: image/jpeg
base64 encoded data ..... ......................... ......base64 encoded data --98766789--
Formatos de mensagem de correio: extensões multimídia
![Page 52: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/52.jpg)
52
• SMTP: entrega/armazenamento no servidor do receptor● protocolo de acesso ao correio: recupera do servidor
• POP: Post Office Protocol [RFC 1939]● autorização (agente <-->servidor) e transferência
• IMAP: Internet Mail Access Protocol [RFC 1730]● mais comandos (mais complexo)● manuseio de msgs armazenadas no servidor● HTTP: Hotmail , Yahoo! Mail, Webmail, etc.
Protocolos de acesso ao correio
![Page 53: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/53.jpg)
53
POP3fase de autorização
comandos do cliente: user: declara nomepass: senha
servidor responde+OK-ERR
fase de transação, cliente:list: lista números das msgsretr: recupera msg por númerodele: apaga msgquit:
Protocolos de acesso ao correioS: +OK POP3 server ready C: user ana S: +OK C: pass faminta S: +OK user successfully logged on
C: list S: 1 498 S: 2 912 S: . C: retr 1 S: <message 1 contents> S: . C: dele 1 C: retr 2 S: <message 1 contents> S: . C: dele 2 C: quit S: +OK POP3 server signing off
![Page 54: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/54.jpg)
54
Mais sobre o POP3
● O exemplo anterior usa o modo “download e delete”.● Bob não pode reler as mensagens se mudar de cliente● “Download-e-mantenha”: copia as mensagens em clientes diferentes ● POP3 não mantém estado entre conexões
IMAP
● Mantém todas as mensagens num único lugar: o servidor● Permite ao usuário organizar as mensagens em pastas● O IMAP mantém o estado do usuário entre sessões:
● nomes das pastas e mapeamentos entre as IDs das mensagens e o nome da pasta
Protocolos de acesso ao correio
![Page 55: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/55.jpg)
55
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 56: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/56.jpg)
56
• 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
● Pergunta: como mapear entre nome e endereço IP?
DNS: o serviço de diretório da Internet
![Page 57: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/57.jpg)
57
• Domain Name System:
● base de dados distribuída implementada na hierarquia de muitos servidores de nomes
• O DNS é (1) um banco de dados distribuído executado em uma hierarquia de servidores de DNS, e (2) um protocolo de camada de aplicação que permite que hospedeiros consultem o banco de dados distribuído.
● nota: função imprescindível da Internet implementada como protocolo de camada de aplicação
● complexidade na borda da rede● Roda sobre UDP e usa a porta 53
● RFCs 1034, 1035● Atualizado em outras RFCs
DNS: o serviço de diretório da Internet
![Page 58: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/58.jpg)
58
O DNS provê alguns outros serviços importantes além da tradução de nomes de hospedeiro para endereços IP:
• Apelidos (aliasing) de hospedeiro.
• Apelidos de servidor de correio.
• Distribuição de carga.
DNS: o serviço de diretório da Internet
![Page 59: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/59.jpg)
59
• Nenhum servidor DNS isolado tem todos os mapeamentos para todos os hospedeiros da Internet.
• Em vez disso, os mapeamentos são distribuídos pelos servidores DNS.
Parte da hierarquia de servidores DNS
DNS: o serviço de diretório da Internet
![Page 60: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/60.jpg)
60
• 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)
DNS: o serviço de diretório da Internet
![Page 61: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/61.jpg)
61
• Servidores DNS raiz em 2012 (nome, organização, localização)
DNS: o serviço de diretório da Internet
![Page 62: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/62.jpg)
62
• Servidores DNS locais:
● Não pertence necessariamente à hierarquia
● Cada ISP (ISP residencial, companhia, universidade) possui um.
● Também chamada do “servidor de nomes default”
● Quando 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.
DNS: o serviço de diretório da Internet
![Page 63: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/63.jpg)
63
• Interação dos diversos servidores DNS:
● 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”
DNS: o serviço de diretório da Internet
![Page 64: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/64.jpg)
64
• O DNS explora extensivamente o cache para melhorar o desempenho quanto ao atraso e reduzir o número de mensagens DNS que dispara pela Internet.
• Consultas recursivas em DNS
DNS: o serviço de diretório da Internet
![Page 65: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/65.jpg)
65
• Um RR (registro de recurso) é uma tupla de quatro elementos que contém os seguintes campos:
(Nome, Valor, Tipo, Sobrevida)
● Tipo=A ● nome é nome de hospedeiro● valor é o seu endereço IP
● Tipo=NS● nome é domínio (p.ex. foo.com.br)● valor é endereço IP de servidor oficial de nomes para este domínio
● Tipo=CNAME● nome é nome alternativo (alias) para algum nome “canônico” (verdadeiro)● valor é o nome canônico
● Tipo=MX● nome é domínio ● valor é nome do servidor de correio para este domínio
Registros e mensagens DNS
![Page 66: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/66.jpg)
66
• DNS: mensagens de pedido e resposta, ambas com o mesmo formato de mensagem
Registros e mensagens DNS
cabeçalho de msg:
● identificação: ID de 16 bit para pedido e resposta ao pedido usam mesmo ID
● flags:● pedido ou resposta● recursão desejada● recursão permitida● resposta é oficial
![Page 67: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/67.jpg)
67
● 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?
Registros e mensagens DNS
![Page 68: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/68.jpg)
68
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 69: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/69.jpg)
69
Distribuição de arquivos P2P
• Na distribuição de arquivos P2P, cada par pode redistribuir qualquer parte do arquivo recebido para outros pares, auxiliando, assim, o servidor no processo de distribuição.
• O tempo de distribuição é o tempo necessário para que todos os N pares obtenham uma cópia do arquivo.
• O BitTorrent é um protocolo P2P popular para distribuição de arquivos.
Aplicações P2P
![Page 70: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/70.jpg)
70
Distribuição de arquivos P2P
Um problema ilustrativo de distribuição de arquivo
Aplicações P2P
![Page 71: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/71.jpg)
71
Distribuição de arquivos P2P
Tempo de distribuição para arquiteturas P2P e cliente-servidor
Aplicações P2P
![Page 72: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/72.jpg)
72
Distribuição de arquivos P2P
Distribuição de arquivos com o BitTorrent
Aplicações P2P
![Page 73: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/73.jpg)
73
Distributed Hash Tables (DHTs)
• Vamos considerar como montar uma versão distribuída, P2P, de um banco de dados, que guardará os pares (chave, valor) por milhões.
• No sistema P2P, cada par só manterá um pequeno subconjunto da totalidade (chave, valor).
• Permitiremos que qualquer par consulte o banco de dados distribuído com uma chave em particular.
Aplicações P2P
![Page 74: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/74.jpg)
74
Distributed Hash Tables (DHTs)
• O banco de dados distribuído, então, localizará os pares que possuem os pares (chave, valor) correspondentes e retornará os pares chave valor ao consultante.‑
• Qualquer par também poderá inserir novos pares chave-valor no banco de dados.
• Esse banco de dados distribuído é considerado como uma tabela hash distribuída (DHT — Distributed Hash Table).
• Problema: cada nó deve conter apontamentos para todos os outros nós?
Aplicações P2P
![Page 75: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/75.jpg)
75
Distributed Hash Tables (DHTs)
• O DHT circular oferece uma solução bastante elegante para reduzir a quantidade de informação sobreposta que cada par deve gerenciar.
Aplicações P2P
![Page 76: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/76.jpg)
76
Distributed Hash Tables (DHTs)
• Em sistemas P2P, um par pode vir ou ir sem aviso.
• Suponha que o par 5 da figura anterior saia de modo abrupto.
• Os dois pares precedentes ao que saiu (4 e 3) saberão que o par saiu, pois não responde mais às mensagens de ping.
• Os pares 4 e 3 precisam, portanto, atualizar as informações do estado de seu sucessor.
Aplicações P2P
![Page 77: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/77.jpg)
77
Distributed Hash Tables (DHTs)
• Consideraremos agora como o par 4 atualiza seu estado:
1. O par 4 substitui seu primeiro sucessor (par 5) por seu segundo sucessor (par 8).
2. O par 4, então, pergunta a seu novo primeiro sucessor (par 8) o identificador e o endereço IP de seu sucessor imediato (par 10). O par 4, então, torna o par 10 seu segundo sucessor.
Aplicações P2P
![Page 78: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/78.jpg)
78
2.1 – Princípios das aplicações de rede2.2 – A Web e o HTTP2.3 – Transferência de arquivos: FTP2.4 – Correio eletrônico na Internet2.5 – DNS: o serviço de diretório da Internet2.6 – Aplicações P2P2.7 – Programação de Sockets: criando aplicações de rede
Sumário
![Page 79: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/79.jpg)
79
• Há dois tipos de aplicações de rede.
• Um deles é uma execução cuja operação é especificada em um padrão de protocolo.
• O outro tipo de aplicação de rede é uma aplicação de rede proprietária.
Programação de sockets
• Usaremos a aplicação cliente-servidor simples a seguir para demonstrar a programação de socket para UDP e TCP:
Programação de sockets: criando aplicações de rede
![Page 80: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/80.jpg)
80
1. Um cliente lê uma linha de caracteres (dados) do teclado e a envia para o servidor.
2. O servidor recebe os dados e converte os caracteres para maiúsculas.
3. O servidor envia os dados modificados ao cliente.
4. O cliente recebe os dados modificados e apresenta a linha em sua tela.
Programação de sockets com UDP
![Page 81: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/81.jpg)
81
A aplicação cliente-servidor usando UDP
Programação de sockets com UDP
![Page 82: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/82.jpg)
82
• O processo TCPServer tem dois sockets
Programação de sockets com TCP
![Page 83: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/83.jpg)
83
• A aplicação cliente-servidor usando TCP
Programação de sockets com TCP
![Page 84: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/84.jpg)
84
• No livro texto podem ser encontrados os fontes em Python dos programas.
• No site do curso estão disponíveis as versões em: Java, Python e C.
• Aqui vou apresentar em C
Programação de sockets
![Page 85: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/85.jpg)
85
● Cliente/Servidor de repetição (echo client/server)
● O cliente envia uma mensagem que é repetida de volta
Programação de sockets
Cliente Servidor
Mensagem
Mensagem
![Page 86: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/86.jpg)
86
● Cliente/Servidor de repetição (echo client/server)
● O cliente envia uma mensagem que é repetida de volta
● Os fontes estão no site, tanto para TCP quanto para UDP!!!
● Vamos executar em sala de aula!!!
Programação de sockets
Cliente (tc.c/uc.c)
Servidor(ts.c/us.c)
Mensagem
Mensagem
![Page 87: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/87.jpg)
87Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 88: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/88.jpg)
88Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
CABEÇALHO
![Page 89: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/89.jpg)
89Programação de sockets ● Cliente/Servidor UDP (Servidor - cabeçalho)// No codeblocks (Windows) inclua no menu em: Project ->// Build Options...-> Linker settings -> Other link options: // -l wsock32// Se for no Linux comente essa linha e compile no terminal: // gcc -o us us.c#define WIN #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#ifdef WIN#include <winsock2.h>#else#include <sys/socket.h>#include <arpa/inet.h>#endif
#define TAM_MENSAGEM 255 /* mensagem de maior tamanho */
#define PORTA_SERVIDOR_UDP 8888
![Page 90: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/90.jpg)
90Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
MAIN()
![Page 91: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/91.jpg)
91Programação de sockets ● Cliente/Servidor UDP (Servidor – main - variáveis)int main(){ /* Socket */ int sock; /* Resultado das funções */ int resultado; /* Endereço do Cliente */ struct sockaddr_in endereco; /* Buffer para a recepção da string de echo */ char mensagem[TAM_MENSAGEM]; #ifdef WIN /* Início do ambiente Windows */ WORD wPackedValues; WSADATA SocketInfo; int nLastError,
nVersionMinor = 1, nVersionMajor = 1;
wPackedValues = (WORD)(((WORD)nVersionMinor)<< 8)| (WORD)nVersionMajor; nLastError = WSAStartup(wPackedValues, &SocketInfo);#endif
![Page 92: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/92.jpg)
92Programação de sockets ● Cliente/Servidor UDP (Servidor – main - variáveis)sock = criar_socket(PORTA_SERVIDOR_UDP);if (sock < 0){printf("\nErro na criação do socket!\n");return(1);}
for (;;) /* Loop eterno */{ /* Recebe mensagem do cliente */ resultado = receber_mensagem(mensagem,sock,&endereco); if (resultado < 0) {printf("\nErro no recebimento da mensagem\n");return(1);}
/* Devolve a mensagem para o cliente */ resultado = enviar_mensagem(mensagem,sock,&endereco); if (resultado < 0) {printf("\nErro no envio da mensagem\n");return(1);}} /* não passa por aqui */}
![Page 93: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/93.jpg)
93Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 94: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/94.jpg)
94Programação de sockets ● Cliente/Servidor UDP (Servidor – criar_socket)int criar_socket(int porta){ int sock; /* Socket para retornar */ struct sockaddr_in endereco; /* Endereço Local */ /* Criação do socket datagrama/UDP para recepção e envio de pacotes */ if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {printf("\nErro na criação do socket!\n");fflush(stdout);return(-1);} /* Se precisar de uma porta específica */ if (porta > 0) { /* Construção da estrutura de endereço local */ /* Zerar a estrutura */ memset(&endereco, 0, sizeof(endereco)); /* Família de endereçamento da Internet */ endereco.sin_family = AF_INET; /* Qualquer interface de entrada */ endereco.sin_addr.s_addr = htonl(INADDR_ANY); /* Porta local */ endereco.sin_port = htons(porta); /* Instanciar o endereco local */ if (bind(sock, (struct sockaddr *) &endereco, sizeof(endereco)) < 0) {printf("\nErro no bind()!\n");fflush(stdout);return(-1);} } return(sock);} // socket(int socket_family, int socket_type, int protocol);
![Page 95: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/95.jpg)
95Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 96: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/96.jpg)
96Programação de sockets ● Cliente/Servidor UDP (Servidor – receber_mensagem)
int receber_mensagem(char *mensagem,int sock, struct sockaddr_in *endereco){ /* Define o tamanho do endereço de recepção e envio */ int tamanho_endereco = sizeof(struct sockaddr_in); /* Limpar o buffer da mensagem */ memset((void *) mensagem,(int) NULL,TAM_MENSAGEM); /* Espera pela recepção de alguma mensagem de algum cliente */ if (recvfrom(sock, mensagem, TAM_MENSAGEM - 1, 0, (struct sockaddr *) endereco, &tamanho_endereco) < 0) { printf("\nErro na recepção da mensagem\n");fflush(stdout); return(-1); } printf("\nUDP Servidor: Recebi (%s)\n",mensagem);fflush(stdout); return(0);}// ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
![Page 97: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/97.jpg)
97Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 98: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/98.jpg)
98Programação de sockets ● Cliente/Servidor UDP (Servidor – receber_mensagem)int enviar_mensagem(char *mensagem,int sock, struct sockaddr_in *endereco){ /* Devolve o conteúdo do datagrama para o cliente */ if (sendto(sock, mensagem, strlen(mensagem), 0, (struct sockaddr *) endereco, sizeof(struct sockaddr)) != strlen(mensagem)) { printf("\nErro no envio da mensagem\n"); return(-1); }
printf("\nUDP Servidor: Enviei (%s)\n",mensagem);
return(0);}//ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
![Page 99: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/99.jpg)
99Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
CABEÇALHO
![Page 100: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/100.jpg)
100Programação de sockets ● Cliente/Servidor UDP (Cliente - cabeçalho)// No codeblocks (Windows) inclua no menu em: Project ->// Build Options...-> Linker settings -> Other link options: // -l wsock32// Se for no Linux comente essa linha e compile no terminal: // gcc -o uc uc.c#define WIN #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#ifdef WIN#include <winsock2.h>#else#include <sys/socket.h>#include <arpa/inet.h>#endif
#define TAM_MENSAGEM 255 /* mensagem de maior tamanho */
#define PORTA_SERVIDOR_UDP 8888
![Page 101: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/101.jpg)
101Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
MAIN()
![Page 102: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/102.jpg)
102Programação de sockets ● Cliente/Servidor UDP (Cliente – main - variáveis)int main(int argc, char **argv){ /* Socket */ int sock; /* Resultado das funções */ int resultado; /* IP do servidor */ char IP[TAM_MENSAGEM]; /* Buffer para a recepção da string de echo */ char mensagem[TAM_MENSAGEM]; #ifdef WIN /* Início do ambiente Windows */ WORD wPackedValues; WSADATA SocketInfo; int nLastError,
nVersionMinor = 1, nVersionMajor = 1;
wPackedValues = (WORD)(((WORD)nVersionMinor)<< 8)| (WORD)nVersionMajor; nLastError = WSAStartup(wPackedValues, &SocketInfo);#endif
![Page 103: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/103.jpg)
103Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
MAIN()
![Page 104: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/104.jpg)
104Programação de sockets ● Cliente/Servidor UDP (Cliente – main - Parâmetros)
/* Parâmetros - INICIO */
/* Testa se o número de parâmetros está correto */if (argc != 3) { printf("Uso: %s <IP Servidor> <Palavra de Echo>\n", argv[0]); Return(1); /* exemplo: uc 127.0.0.1 oi */ /* exemplo: uc 127.0.0.1 “oi estou aqui” */}
memset((void *) IP ,(int) NULL,TAM_MENSAGEM);strcpy(IP ,argv[1]); /* IP Servidor (local 127.0.0.1) */
memset((void *) mensagem,(int) NULL,TAM_MENSAGEM);strcpy(mensagem,argv[2]); /* Mensagem */
/* Parâmetros - FINAL */
![Page 105: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/105.jpg)
105Programação de sockets ● Cliente/Servidor UDP (Cliente – main -cont.)
sock = criar_socket(0); if (sock < 0) {printf("\nErro na criação do socket!\n");return(1);} /* Envia mensagem para o servidor */ resultado = enviar_mensagem(mensagem,sock,IP); if (resultado < 0) {printf("\nErro no envio da mensagem\n");return(1);} /* Recebe mensagem do servidor */ resultado = receber_mensagem(sock); if (resultado < 0) {printf("\nErro no recebimento da mensagem\n");return(1);} /* Fecha o socket e retorna */ close(sock); return(0);}
![Page 106: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/106.jpg)
106Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 107: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/107.jpg)
107Programação de sockets ● Cliente/Servidor UDP (Cliente – criar_socket)
int criar_socket(int porta){ int sock; /* Socket para retornar */ struct sockaddr_in endereco; /* Endereço Local */ /* Criação do socket datagrama/UDP para recepção e envio de pacotes */ if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {printf("\nErro na criação do socket!\n");fflush(stdout);return(-1);} /* Se precisar de uma porta específica */ if (porta > 0) { /* Construção da estrutura de endereço local */ /* Zerar a estrutura */ memset(&endereco, 0, sizeof(endereco)); /* Família de endereçamento da Internet */ endereco.sin_family = AF_INET; /* Qualquer interface de entrada */ endereco.sin_addr.s_addr = htonl(INADDR_ANY); endereco.sin_port = htons(porta); /* Porta local */ /* Instanciar o endereco local */ if (bind(sock, (struct sockaddr *) &endereco, sizeof(endereco)) < 0) {printf("\nErro no bind()!\n");fflush(stdout);return(-1);} } return(sock);}
![Page 108: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/108.jpg)
108Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 109: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/109.jpg)
109Programação de sockets ● Cliente/Servidor UDP (Cliente – enviar_mensagem)int enviar_mensagem(char *mensagem,int sock,char *IP){ struct sockaddr_in endereco; /* Endereço do Servidor */ /* Construção da estrutura de endereço do servidor */ /* Zerar a estrutura */ memset(&endereco, 0, sizeof(endereco)); /* Família de endereçamento da Internet */ endereco.sin_family = AF_INET; /* Endereço IP do Servidor */ endereco.sin_addr.s_addr = inet_addr(IP); /* Porta do Servidor */ endereco.sin_port = htons(PORTA_SERVIDOR_UDP); /* Enviar mensagem para o servidor */ if (sendto(sock, mensagem, strlen(mensagem), 0, (struct sockaddr *) &endereco, sizeof(struct sockaddr_in)) != strlen(mensagem)) {printf("\nErro no envio da mensagem\n");return(-1);} printf("\nUDP Cliente: Enviei (%s)\n",mensagem); return(0);}
![Page 110: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/110.jpg)
110Programação de sockets ● Cliente/Servidor UDP
receber_mensagem(socket_servidor, mensagem)
Cliente (UC.C)Servidor (US.C)
socket_servidor = criar_socket(8888)
enviar_mensagem(socket_servidor, IP_cliente,
porta_cliente mensagem)
enviar_mensagem(socket_cliente, IP_servidor, porta_servidor, mensagem)
receber_parâmetros()socket_cliente = criar_socket(0)
receber_mensagem(socket_cliente, mensagem)
fechar_socket, socket_cliente)
mensagem
mensagem
mensagem
Mensagem /IP Servidor
Mensagem /IP Servidor
![Page 111: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/111.jpg)
111Programação de sockets ● Cliente/Servidor UDP (Cliente – receber_mensagem)
int receber_mensagem(int sock){ /* Buffer para a recepção da string de echo */ char mensagem[TAM_MENSAGEM]; struct sockaddr_in endereco; /* Endereço do Servidor */ /* Define o tamanho do endereço de recepção e envio */ int tamanho_endereco = sizeof(struct sockaddr_in); /* Limpar o buffer da mensagem */ memset((void *) mensagem,(int) NULL,TAM_MENSAGEM); /* Espera pela recepção de alguma mensagem de algum cliente */ if (recvfrom(sock, mensagem, TAM_MENSAGEM - 1, 0, (struct sockaddr *) &endereco, &tamanho_endereco) < 0) { printf("\nErro na recepção da mensagem\n");fflush(stdout); return(-1); } printf("\nUDP Cliente: Recebi (%s)\n",mensagem);fflush(stdout); return(0);}
![Page 112: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/112.jpg)
112Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 113: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/113.jpg)
113Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 114: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/114.jpg)
114Programação de sockets ● Cliente/Servidor TCP (Servidor - cabeçalho)// No codeblocks (Windows) inclua no menu em: Project ->// Build Options...-> Linker settings -> Other link options: // -l wsock32// Se for no Linux comente essa linha e compile no terminal: // gcc -o ts ts.c#define WIN #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#ifdef WIN#include <winsock2.h>#else#include <sys/socket.h>#include <arpa/inet.h>#endif#define TAM_MENSAGEM 255 /* mensagem de maior tamanho *//* Número máximo de requisições para conexão pendentes */#define MAXPENDING 5 #define PORTA_SERVIDOR_TCP 9999
![Page 115: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/115.jpg)
115Programação de sockets ● Cliente/Servidor TCP (Servidor – main - variáveis)
int main(){ /* Socket */ int sock; /* Socket da conexão com o cliente */ int socket_cliente; /* Resultado das funções */ int resultado; /* Buffer para a recepção da string de echo */ char mensagem[TAM_MENSAGEM]; #ifdef WIN /* Início do ambiente Windows */ WORD wPackedValues; WSADATA SocketInfo; int nLastError,
nVersionMinor = 1, nVersionMajor = 1;
wPackedValues = (WORD)(((WORD)nVersionMinor)<< 8)| (WORD)nVersionMajor; nLastError = WSAStartup(wPackedValues, &SocketInfo);#endif
![Page 116: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/116.jpg)
116Programação de sockets ● Cliente/Servidor TCP (Servidor – main – cont.)
sock = criar_socket(PORTA_SERVIDOR_TCP);if (sock < 0){printf("\nErro na criação do socket!\n");return(1);}for (;;) /* Loop eterno */{ /* Aguarda por uma conexão e a aceita criando o socket de contato com o cliente */ socket_cliente = aceitar_conexao(sock); if (socket_cliente == 0) {printf("\nErro na conexao do socket!\n");return(1);} /* Recebe a mensagem do cliente */ resultado = receber_mensagem(mensagem,socket_cliente); if (resultado < 0) {printf("\nErro no recebimento da mensagem\n");return(1);} /* Devolve o conteúdo da mensagem para o cliente */ resultado = enviar_mensagem(mensagem,socket_cliente); if (resultado < 0) {printf("\nErro no envio da mensagem\n");return(1);} close(socket_cliente); /* Fecha o socket do cliente */}/* não passa por aqui */}
![Page 117: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/117.jpg)
117Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 118: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/118.jpg)
118Programação de sockets ● Cliente/Servidor TCP (Servidor – criar_socket)
int criar_socket(int porta){ int sock; struct sockaddr_in endereco; /* Endereço Local */ /* Criação do socket TCP para recepção e envio de pacotes */ if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {printf("\nErro na criação do socket!\n");return(-1);} if (porta > 0) { /* Construção da estrutura de endereço local */ memset(&endereco, 0, sizeof(endereco)); /* Zerar a estrutura */ /* Família de endereçamento da Internet */ endereco.sin_family = AF_INET; /* Qualquer interface de entrada */ endereco.sin_addr.s_addr = htonl(INADDR_ANY); endereco.sin_port = htons(porta); /* Porta local */ /* Instanciar o endereco local */ if (bind(sock, (struct sockaddr *) &endereco, sizeof(endereco)) < 0) {printf("\nErro no bind()!\n");return(-1);} /* Indica que o socket escutara as conexões */
if (listen(sock, MAXPENDING) < 0) {printf("\nErro no listen()!\n");return(-1);} } return(sock);}
![Page 119: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/119.jpg)
119Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 120: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/120.jpg)
120Programação de sockets ● Cliente/Servidor TCP (Servidor – aceitar_conexao)
int aceitar_conexao(int sock){ int socket_cliente; struct sockaddr_in endereco; /* Endereço Local */ int tamanho_endereco;
/* Define o tamanho do endereço de recepção e envio */ tamanho_endereco = sizeof(endereco);
/* Aguarda pela conexão de um cliente */ if ((socket_cliente = accept(sock, (struct sockaddr *) &endereco, &tamanho_endereco)) < 0) { printf("\nErro no accept()!\n");fflush(stdout); return(0); } return(socket_cliente);}
![Page 121: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/121.jpg)
121Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 122: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/122.jpg)
122Programação de sockets ● Cliente/Servidor TCP (Servidor – receber_mensagem)int receber_mensagem(char *mensagem,int sock){ /* Limpar o buffer da mensagem */ memset((void *) mensagem,(int) NULL,TAM_MENSAGEM);
/* Espera pela recepção de alguma mensagem do cliente conectado */ if (recv(sock, mensagem, TAM_MENSAGEM, 0) < 0) { printf("\nErro na recepção da mensagem\n"); return(-1); }
printf("\nTCP Servidor: Recebi (%s)\n",mensagem);
return(0);}// ssize_t recv(int sockfd, void *buf, size_t len, int flags);
![Page 123: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/123.jpg)
123Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 124: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/124.jpg)
124Programação de sockets ● Cliente/Servidor TCP (Servidor – enviar_mensagem)
int enviar_mensagem(char *mensagem,int sock){ /* Devolve o conteúdo da mensagem para o cliente */ if (send(sock, mensagem, strlen(mensagem), 0) != strlen(mensagem)) { printf("\nErro no envio da mensagem\n"); return(-1); }
printf("\nTCP Servidor: Enviei (%s)\n",mensagem);
return(0);}
// ssize_t send(int sockfd, const void *buf, size_t len, int flags);
![Page 125: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/125.jpg)
125Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 126: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/126.jpg)
126Programação de sockets ● Cliente/Servidor TCP (Cliente - cabeçalho)
// No codeblocks (Windows) inclua no menu em: Project ->// Build Options...-> Linker settings -> Other link options: // -l wsock32// Se for no Linux comente essa linha e compile no terminal: // gcc -o tc tc.c#define WIN #include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#ifdef WIN#include <winsock2.h>#else#include <sys/socket.h>#include <arpa/inet.h>#endif#define TAM_MENSAGEM 255 /* mensagem de maior tamanho *//* Número máximo de requisições para conexão pendentes */ #define PORTA_SERVIDOR_TCP 9999
![Page 127: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/127.jpg)
127Programação de sockets ● Cliente/Servidor TCP (Cliente – main - variáveis)int main(int argc, char **argv){ /* Socket */ int sock; /* Resultado das funções */ int resultado; /* Buffer para a recepção da string de echo */ char mensagem[TAM_MENSAGEM]; /* Endereço IP do Servidor */ char IP[TAM_MENSAGEM]; #ifdef WIN /* Início do ambiente Windows */ WORD wPackedValues; WSADATA SocketInfo; int nLastError,
nVersionMinor = 1, nVersionMajor = 1;
wPackedValues = (WORD)(((WORD)nVersionMinor)<< 8)| (WORD)nVersionMajor; nLastError = WSAStartup(wPackedValues, &SocketInfo);#endif
![Page 128: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/128.jpg)
128Programação de sockets ● Cliente/Servidor TCP (Cliente – main - parâmetros)
/* Parâmetros - INICIO */ /* Testa se o número de parâmetros está correto */ if (argc != 3) { printf("Uso: %s <IP Servidor> <Palavra de Echo>\n" , argv[0]); return(1);/* exemplo: tc 127.0.0.1 oi */ /* exemplo: tc 127.0.0.1 “oi estou aqui” */ } memset((void *) IP ,(int) NULL,TAM_MENSAGEM); strcpy(IP ,argv[1]); /* IP Servidor */ memset((void *) mensagem,(int) NULL,TAM_MENSAGEM); strcpy(mensagem,argv[2]); /* Parâmetros - FINAL */
![Page 129: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/129.jpg)
129Programação de sockets ● Cliente/Servidor TCP (Cliente – main – cont.) /* Criação do socket */ sock = criar_socket(0); if (sock < 0) {printf("\nErro na criação do socket!\n");return(1);} /* Estabelecer conexão com o servidor */ resultado = conectar_com_servidor(sock,IP,PORTA_SERVIDOR_TCP); if (resultado < 0) {printf("\nErro no recebimento da mensagem\n");return(1);} /* Enviar mensagem para o servidor */ resultado = enviar_mensagem(mensagem,sock); if (resultado < 0) {printf("\nErro no envio da mensagem\n");return(1);} /* Recebendo como resposta a mesma string vinda do servidor */ resultado = receber_mensagem(mensagem,sock); if (resultado < 0) {printf("\nErro no recebimento da mensagem\n");return(1);} /* Fechar socket */ close(sock); return(0);}
![Page 130: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/130.jpg)
130Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 131: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/131.jpg)
131Programação de sockets ● Cliente/Servidor TCP (Cliente – criar_socket)
int criar_socket(int porta){ int sock; struct sockaddr_in endereco; /* Endereço Local */ /* Criação do socket TCP para recepção e envio de pacotes */ if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {printf("\nErro na criação do socket!\n");return(-1);} if (porta > 0) { /* Construção da estrutura de endereço local */ /* Zerar a estrutura */ memset(&endereco, 0, sizeof(endereco)); /* Família de endereçamento da Internet */ endereco.sin_family = AF_INET; /* Qualquer interface de entrada */ endereco.sin_addr.s_addr = htonl(INADDR_ANY); endereco.sin_port = htons(porta); /* Porta local */ /* Instanciar o endereco local */ if (bind(sock, (struct sockaddr *) &endereco, sizeof(endereco)) < 0) {printf("\nErro no bind()!\n");return(-1);} /* Indica que o socket escutara as conexões */ if (listen(sock, MAXPENDING) < 0) {printf("\nErro no listen()!\n");return(-1);} } return(sock);}
![Page 132: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/132.jpg)
132Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 133: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/133.jpg)
133Programação de sockets ● Cliente/Servidor TCP (Cliente - conectar_com_servidor)
int conectar_com_servidor(int sock,char *IP,int porta){ struct sockaddr_in endereco; /* Endereço Local */ /* Construção da estrutura de endereço do servidor */ /* Zerar a estrutura */ memset(&endereco, 0, sizeof(endereco)); /* Família de endereçamento da Internet */ endereco.sin_family = AF_INET; /* Endereço IP do Servidor */ endereco.sin_addr.s_addr = inet_addr(IP); /* Porta do Servidor */ endereco.sin_port = htons(porta); /* Estabelecimento da conexão com o servidor de echo */ if (connect(sock, (struct sockaddr *) &endereco, sizeof(endereco)) < 0) {printf("\nErro no connect()!\n");fflush(stdout);return(-1);} return(0);}
![Page 134: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/134.jpg)
134Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 135: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/135.jpg)
135Programação de sockets ● Cliente/Servidor TCP (Cliente - enviar_mensagem)
int enviar_mensagem(char *mensagem,int sock){ /* Envia o conteúdo da mensagem para o cliente */ if (send(sock, mensagem, strlen(mensagem), 0) != strlen(mensagem)) { printf("\nErro no envio da mensagem\n"); return(-1); }
printf("\nTCP Cliente: Enviei (%s)\n",mensagem);
return(0);}
![Page 136: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/136.jpg)
136Programação de sockets ● Cliente/Servidor TCP
receber_mensagem(mensagem,socket_cliente)
Cliente (TC.C)Servidor (TS.C)
sock = criar_socket(9999)
enviar_mensagem(mensagem,socket_cliente)
enviar_mensagem(mensagem,sock)
conectar_com_servidor(sock,IP,9999)
receber_mensagem(mensagem,sock)
mensagemmensagem
mensagem
mensagem /IP Servidor
socket_cliente = aceitar_conexao(sock)
mensagem
conexão
Receber parâmetrossock = criar_socket(0)
![Page 137: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/137.jpg)
137Programação de sockets ● Cliente/Servidor TCP (Cliente - receber_mensagem)
int receber_mensagem(char *mensagem,int sock){ /* Limpar o buffer da mensagem */ memset((void *) mensagem,(int) NULL,TAM_MENSAGEM); /* Espera pela recepção de alguma mensagem do cliente conectado*/ if (recv(sock, mensagem, TAM_MENSAGEM, 0) < 0) { printf("\nErro na recepção da mensagem\n"); return(-1); }
printf("\nTCP Cliente: Recebi (%s)\n",mensagem);
return(0);}
![Page 138: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/138.jpg)
138Programação de sockets
● Testem os programas!
● Vejam como eles funcionam!
● Coloquem mensagens de instrumentação no código para acompanhar os passos!
![Page 139: Capítulo 2 Camada de aplicação - UFFlsousa/redes_i/cap-2.pdf · • O HTTP — Protocolo de Transferência de Hipertexto (HyperText Transfer Protocol) —, o protocolo da camada](https://reader034.fdocument.pub/reader034/viewer/2022043016/5f38d7e8f5469b70cd249d21/html5/thumbnails/139.jpg)
139
Capítulo 2 - FIM