Slide 1

Slide 1 text

Redes de Computadores Sockets Gustavo Pantuza Departamento de Ciência da Computação - UFMG primeiro de Setembro, 2014

Slide 2

Slide 2 text

Introdução Redes Sockets API Workflow Experimentos Perguntas O que são sockets? Sockets são uma maneira de comunicar com outros processos através da Internet. Formalmente seria: Inter-Process Comunication (IPC) Gustavo Pantuza Sockets

Slide 3

Slide 3 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Quem criou? Foi criado pelo BSD (Berkeley Software Distribution) Seu primeiro release foi no formato de uma API em 1983 no Sistema Operacional Unix 4.2BSD Gustavo Pantuza Sockets

Slide 4

Slide 4 text

Introdução Redes Sockets API Workflow Experimentos Perguntas O que é possível fazer com isso? Criar um servidor Web Definir novos protocolos na camada de aplicação Criar um servidor de Streamming Medir tempo, banda e latência ao longo da internet Fazer broadcast na rede Gustavo Pantuza Sockets

Slide 5

Slide 5 text

Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação às camadas de rede, onde ele fica? Bom, você deve ser familiarizado com isso: Gustavo Pantuza Sockets

Slide 6

Slide 6 text

Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação às camadas de rede, onde ele fica? e com isso: Gustavo Pantuza Sockets

Slide 7

Slide 7 text

Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação às camadas de rede, onde ele fica? e mais isso: Gustavo Pantuza Sockets

Slide 8

Slide 8 text

Introdução Redes Sockets API Workflow Experimentos Perguntas E em relação às camadas de rede, onde ele fica? e aqui, reside a API Socket: Gustavo Pantuza Sockets

Slide 9

Slide 9 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Tipos de Sockets Existem dois tipos 1 de Sockets: Stream Sockets → Orientado a conexão Datagram Sockets → Não orientado a conexão 1Existem outros tipos de sockets, por exemplo raw sockets. No entanto eles não serão abordados. Gustavo Pantuza Sockets

Slide 10

Slide 10 text

Introdução Redes Sockets API Workflow Experimentos Perguntas SOCK_STREAM Utiliza o protocolo TCP para transmitir os pacotes Canal exclusivo entre o cliente e o servidor Confiável e sem perda Garante a ordem dos pacotes enviados e recebidos Demora para recuperar de falhas de transmissão ou perda de pacotes Gustavo Pantuza Sockets

Slide 11

Slide 11 text

Introdução Redes Sockets API Workflow Experimentos Perguntas SOCK_DGRAM Utiliza o protocolo UDP para transmitir os pacotes Não possuí um canal dedicado/exclusivo entre servidor e cliente Não é totalmente confiável pois permite perda de pacotes A ordem dos pacotes não é uma garantia Permite recuperar rapidamente de erros/perdas de pacotes Gustavo Pantuza Sockets

Slide 12

Slide 12 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Stream versus Datagram Aparentemente, pelas características de cada tipo de socket, tende-se a achar que os SOCK_STREAM (TCP) são melhores do que os SOCK_DGRAM (UDP). No entanto, isso não é uma verdade. Tudo depende do objetivo e das características da aplicação que utilizará os sockets. Gustavo Pantuza Sockets

Slide 13

Slide 13 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Exemplos Uma aplicação para VoIP, jogos ou transmissão de vídeos não necessita, na maioria dos casos, de controle de conexão, de recuperação de falhas ou retransmissão de pacotes. Logo, o ideal é utilizar o SOCK_DGRAM (UDP) Uma aplicação de trasferência de arquivos ou até mesmo um telnet precisa, necessariamente, de garantia de ordem de pacotes, reenvio em caso de falha. O que torna a aplicação confiável. Logo, se utiliza o SOCK_STREAM (TCP) Gustavo Pantuza Sockets

Slide 14

Slide 14 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Comunicação Gustavo Pantuza Sockets

Slide 15

Slide 15 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza Sockets Estrutura de dados de endereços 2 : 1 /* Structure to contain information about address of a service provider. */ 2 struct addrinfo 3 { 4 int ai_flags; /* Input flags. */ 5 int ai_family; /* Protocol family for socket. */ 6 int ai_socktype; /* Socket type. */ 7 int ai_protocol; /* Protocol for socket. */ 8 socklen_t ai_addrlen; /* Length of socket address. */ 9 struct sockaddr *ai_addr; /* Socket address for socket. */ 10 char *ai_canonname; /* Canonical name for service location. */ 11 struct addrinfo *ai_next; /* Pointer to next in list. */ 12 }; 2código retirado do arquivo /usr/include/netdb.h. Linha 566 Gustavo Pantuza Sockets

Slide 16

Slide 16 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza Sockets Estrutura de dados de sockets 3 : 1 /* Structure describing a generic socket address. */ 2 struct sockaddr 3 { 4 __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ 5 char sa_data[14]; /* Address data. */ 6 }; 3código retirado do arquivo /usr/include/bits/socket.h. Linha 148 Gustavo Pantuza Sockets

Slide 17

Slide 17 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza Sockets Estrutura de dados IPv4 4 : 1 /* Internet address. */ 2 struct in_addr { 3 __be32 s_addr; 4 }; 5 ... 6 /* Structure describing an Internet (IP) socket address. */ 7 #define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ 8 struct sockaddr_in { 9 __kernel_sa_family_t sin_family; /* Address family */ 10 __be16 sin_port; /* Port number */ 11 struct in_addr sin_addr; /* Internet address */ 12 13 /* Pad to size of ‘struct sockaddr’. */ 14 unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - 15 sizeof(unsigned short int) - sizeof(struct in_addr)]; 16 }; 4Códigos retirados do arquivo /usr/include/linux/in.h. Gustavo Pantuza Sockets

Slide 18

Slide 18 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza Sockets Estrutura de dados IPv6 5 : 1 struct in6_addr { 2 union { 3 __u8 u6_addr8[16]; 4 __be16 u6_addr16[8]; 5 __be32 u6_addr32[4]; 6 } in6_u; 7 #define s6_addr in6_u.u6_addr8 8 #define s6_addr16 in6_u.u6_addr16 9 #define s6_addr32 in6_u.u6_addr32 10 }; 11 struct sockaddr_in6 { 12 unsigned short int sin6_family; /* AF_INET6 */ 13 __be16 sin6_port; /* Transport layer port # */ 14 __be32 sin6_flowinfo; /* IPv6 flow information */ 15 struct in6_addr sin6_addr; /* IPv6 address */ 16 __u32 sin6_scope_id; /* scope id (new in RFC2553) */ 17 }; 5Códigos retirados do arquivo /usr/include/linux/in6.h. Gustavo Pantuza Sockets

Slide 19

Slide 19 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza Sockets Famílias de protocolos e endereços 6 : 1 /* Protocol families. */ 2 #define PF_INET 2 /* IP protocol family. */ 3 #define PF_INET6 10 /* IP version 6. */ 4 5 ... 6 7 /* Address families. */ 8 #define AF_INET PF_INET 9 #define AF_INET6 PF_INET6 6Código retirado do arquivo /usr/include/bits/socket.h Gustavo Pantuza Sockets

Slide 20

Slide 20 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como se utiliza Sockets Vamos conhecer primeiro as principais funções 7 e pra que servem: getaddrinfo(): Traduz nomes para endereços sockets. socket(): Cria um socket e retorna o descritor de arquivo. bind(): Associa o socket a um endereço socket e uma porta. connect(): Tenta estabelecer uma conexão com um socket. listen(): Coloca o socket para aguardar conexões. accept(): Aceita uma nova conexão e cria um socket. send(): caso conectado, transmite mensagens ao socket. recv(): recebe as mensagens através do socket. close(): desaloca o descritor de arquivo shutdown(): desabilita a comunicação do socket. 7Existem muitas outras funções. Veja o arquivo /usr/include/sys/socket.h. Além disso, utilize o utilitário man para ver o manual das funções Gustavo Pantuza Sockets

Slide 21

Slide 21 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Arquitetura Cliente Servidor Gustavo Pantuza Sockets

Slide 22

Slide 22 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Como diferenciar Cliente e Servidor? A grande diferença está na forma como se utiliza os sockets. Logo, tem-se uma versão da aplicação implementada para ser cliente e outra para ser servidor. Vejamos alguns exemplos: ssh: Cliente → ssh, servidor → sshd ftp: cliente → ftp, servidor → ftpd HTTP: cliente → chromium, servidor → Nginx Gustavo Pantuza Sockets

Slide 23

Slide 23 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Workflow de um cliente socket Gustavo Pantuza Sockets

Slide 24

Slide 24 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Workflow de um servidor socket Gustavo Pantuza Sockets

Slide 25

Slide 25 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Workflow da comunicação Cliente/Servidor Gustavo Pantuza Sockets

Slide 26

Slide 26 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Experimentos Vamos executar alguns exemplos e ler um pouco de código: netcat 1. Transferir um arquivo via socket 2. Um chat simples DNS: Tradução de um nome em um endereço IP Protocolos: Um protocolo de aplicação simples fork: Um exemplo de servidor que cria processos lsof: Ver os descritores de arquivos abertos pelos processos. netstat: Ver as portas e o estados das conexões. Gustavo Pantuza Sockets

Slide 27

Slide 27 text

Introdução Redes Sockets API Workflow Experimentos Perguntas seja curioso, seja hacker ; ] Leia os fontes de como o linux implementa sockets internamente: 1. /usr/include/sys/socket.h 2. /usr/include/bits/socket.h 3. /usr/include/netdb.h Volte no slide com as principais funções e leia o manual de cada uma utilizando o manual do linux. Ex: man socket, man bind procure artigos sobre o assunto. Ex: artigo Escreva algum programa sobre o assunto, por diversão Gustavo Pantuza Sockets

Slide 28

Slide 28 text

Introdução Redes Sockets API Workflow Experimentos Perguntas Dúvidas? Contatos: email: [email protected] github: pantuza twitter: @gpantuza site: http://pantuza.com Gustavo Pantuza Sockets