TARC2 – 2017.1 – Profa. Morganna EMENTA 1.Conceitos 2.Programa cliente para serviço daytime 3.Execução de aplicativo 1 TARC2 – 2017.1 – Profa. Morganna 1. Conceitos Cliente Protocolo de Aplicação Servidor Daemon – programa que executa um processo em background. Normalmente o cliente inicia a comunicação. Asynchronous callback – o servidor inicia a comunicação. Um cliente normalmente se comunica com apenas um servidor em um determinado tempo. Um servidor se comunica com vários clientes ao mesmo tempo Socket – Internet API que define a interface entre a camada de aplicação e a de transporte. 2 TARC2 – 2017.1 – Profa. Morganna 1. Conceitos Socket Permite comunicação entre dois processos que estão na mesma máquina ou em máquinas diferentes. Em Unix, cada ação de E/S de um soquete corresponde a uma leitura/escrita de/em um descritor de arquivo. Os tipos mais comuns de soquete são: de fluxo - os dados trafegam na forma de um stream de caracteres. ● de datagrama - os dados trafegam na forma de datagramas. É uma combinação de endereço IP e número de porta. 3 TARC2 – 2017.1 – Profa. Morganna 1. Conceitos Socket Alocação padrão das portas: 0 a 1023 – portas do sistema 1024 a 49151 – portas dos usuários ou registradas 49152 a 65535 – portas dinâmicas ou privadas Para ver a lista de portas definidas pela IANA (Internet Assigned Numbers Authority) : less /etc/services ● Portas assinaladas pela IANA: 0 a 49151 4 TARC2 – 2017.1 – Profa. Morganna 1. Conceitos Socket Descobrir o IP e as interfaces da máquina ifconfig Descobrir o IP da Google ping www.google.com.br ● Para saber mais sobre um domínio https://registro.br/2/whois 5 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Programa daytimetcpcli.c – pede a hora e a data, dependente de protocolo IPv4. 1. Cria um soquete com a chamada de sistema socket( ); 2. Conecta o soquete ao endereço do servidor usando a chamada de sistema connect( ); 3. Recebe dados com read( ). 6 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente struct sockaddr { sa_family_t char } ● ● ● sa_family; sa_data[14]; A estrutura sockaddr é um descritor geral para qualquer tipo de socket. O campo sa_family armazena a família do endereço. Exemplos: AF_INET – protocolo IPv4 AF_INET6 – protocolo IPv6 O campo sa_data armazena o endereço do protocolo com até 14 bytes. 7 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; ● A estrutura sockaddr_in é usada para IPv4. ● O campo sin_family possui família do protocolo. ● O campo sin_port possui a porta da camada de transporte. ● O campo sin_addr possui o endereço da rede. struct in_addr { unsigned long s_addr; // armazena com inet_pton( ) }; ● O campo sin_zero[8] não é usado. O objetivo é que a estrutura sockaddr_in possua o mesmo tamanho da estrutura sockaddr. 8 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente struct sockaddr_in6 { sa_family_t in_port_t uint32_t struct in6_addr uint32_t }; sin6_family; sin6_port; sin6_flowinfo; sin6_addr; sin6_scope_id; struct in6_addr { unsigned char s6_addr[16]; }; /* AF_INET6 */ /* port number */ /* IPv6 flowinformation*/ /* IPv6 address */ /* Scope ID */ /* IPv6 address */ 9 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente int socket(int domain, int type, int protocol); ● ● ● ● A chamada de sistemas socket( ) retorna um descritor de arquivo. O argumento domain especifica o domínio da comunicação. Exemplos: AF_INET – protocolo IPv4 AF_INET6 – protocolo IPv6 O argumento type – especifica a semântica da comunicação. Exemplos: SOCK_STREAM – conexão sequenciada, confiável e duplex. SOCK_DGRAM – sem conexão, não confiável. O argumento protocol especifica o protocolo a ser usado. Normalmente existe um único protocolo para uma dada família de protocolos, por isso se especifica zero neste campo. 10 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente void bzero(void *s, size_t n); ● A função bzero( ) move zero ('\0') para os n primeiros bytes da área que começa em s. uint16_t htons(uint16_t hostshort); ● A função htons( ) converte um valor inteiro curto sem sinal da ordem do byte da máquina (host byte order) para a ordem do byte da rede (network byte order). 11 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Os bytes são armazenados na memória do computador em duas possíveis formas: • Big endian – o bit mais significativo é armazenado no endereço de memória mais baixo. • Little endian – o bit menos significativo é armazenado no endereço de memória mais baixo. O termo endianness (extremidade), refere-se à ordem utilizada para representar determinado tipo de dado. 12 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente 13 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Bit mais significativo (1025)10 = 00000000 00000000 00000100 00000001 Bit menos significativo Address Big Endian Little Endian 00 01 02 03 00000000 00000000 00000100 00000001 00000001 00000100 00000000 00000000 Exemplos ● Os processadores Intel usam “little endian order”. ● os Macintosh usam “big endian ordem”. ● As redes usam normalmente o “big endian order”. 14 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Funções de Ordenação de Byte uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); Retornam: valor em network byte order uint16_t ntons(uint16_t net16bitvalue); uint32_t ntonl(uint32_t net32bitvalue); Retornam: valor em host byte order • h = host • s = short • n = network • l = long 15 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Programa byteorder.c (apresentação parcial) union { short s; char c[sizeof(short)]; } un; un.s = 0x0102; if (un.c[0] == 1 && un.c[1] == 2) printf("big-endian byte order\n"); else if (un.c[0] == 2 && un.c[1] == 1) printf("little-endian byte order\n"); else printf("Ordem desconhecida\n"); 16 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Para saber como o Linux armazena os bytes na sua máquina, use o comando lscpu. 17 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente Por que AF_INET não precisa da função htons( ) ? /* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain sockets */ #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ #define AF_APPLETALK 5 /* Appletalk DDP */ #define AF_NETROM 6 /* Amateur radio NetROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_AAL5 8 /* Reserved for Werner's ATM */ #define AF_X25 9 /* Reserved for X.25 project */ #define AF_INET6 10 /* IP version 6 */ #define AF_MAX 12 /* For now.. */ 18 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente int inet_pton(int af, const char *src, void *dst); ● ● ● ● A função inet_pton( ) converte endereços IPv4 e IPv6 de texto para binário. Ela retorna 1 em caso de sucesso; -1 em caso de erro e zero no caso de src não ser um endereço de rede válido. O argumento af deve ser AF_INET ou AF_INET6. O primeiro corresponde ao IPv4 e o segundo ao IPv6. O argumento src contém uma string com um endereço de rede. A função inet_pton( ) só aceita a notação decimal com pontos para IPv4. O argumento dst recebe o endereço de rede convertido pela função inet_pton( ). 19 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ● ● ● ● A chamada de sistemas connect( ) inicia uma conexão com um soquete. Ela retorna zero em caso de sucesso e -1 em caso de erro. O argumento sockfd corresponde ao descritor de arquivo que representa o soquete na máquina local. O argumento sockaddr é uma estrutura com as informações sobre o destino da conexão. O argumento addrlen informa o tamanho da estrutura sockaddr. 20 TARC2 – 2017.1 – Profa. Morganna 2. Programa cliente ssize_t read(int fd, void *buf, size_t count); ● ● ● ● A chamada de sistemas read( ) retorna o número de bytes lidos. Em caso de erro, -1 é retornado. O argumento fd informa o descritor de arquivo a ser lido. O argumento buf especifica a área a ser lida. O argumento count informa o número de bytes a serem lidos. int fputs(const char *s, FILE *stream); ● A função fputs( ) escreve a string s em stream. 21 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo ● Para compilar use o comando gcc –o daytimetcpcli daytimetcpcli.c ● Executar o cliente ./daytimetcpcli 127.0.0.1 => máquina local ./daytimetcpcli 216.58.202.131 => Google sudo ./daytimetcpcli 216.58.202.131 22 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo ● Para verificar situação da porta 13 do Google nmap -Pn -p13 216.58.202.131 ● Para verificar situação da porta 13 local nmap -Pn -p13 127.0.0.1 23 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo ● Para verificar situação da porta 13 do servidor de sincronização da UFRJ nmap -Pn -p13 146.164.48.1 24 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo ● Para verificar situação das portas locais netstat -lntu onde -l – mostra apenas os servidores -n – mostra o número da porta -t – portas tcp -u – portas udp ● Para verificar situação das portas sem servidores netstat -ntu ● Para estatísticas de transmissão netstat -s 25 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo Fonte: http://time.pads.ufrj.br/services.html 26 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo Fonte: http://tf.nist.gov/tf-cgi/servers.cgi 27 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo ● ● Para bloquear a porta 13 local sudo iptables -I INPUT -p tcp --dport 13 -j DROP Para desbloquear a porta 13 local sudo iptables -D INPUT -p tcp --dport 13 -j DROP 28 TARC2 – 2017.1 – Profa. Morganna 3. Execução de Aplicativo Ferramenta iptables – filtra pacotes IPv4 e IPv6 -I : inclui regra -D : deleta regra INPUT : pacotes que chegam OUTPUT : pacotes que partem dport : porta de destino sport : porta de origem DROP : descarta pacote ACCEPT : aceita pacote 29 TARC2 – 2017.1 – Profa. Morganna Exercícios 1. Altere o programa cliente para especificar o tipo de erro com a variável externa errno. 2. Altere a porta do programa cliente para 9999. Qual erro é reportado na execução? 3. Altere o programa cliente de forma que ele trabalhe com o protocolo IPv6. 30 TARC2 – 2017.1 – Profa. Morganna Bibliografia Código-Fonte dos Programas www.unpbook.com Livro-texto Unix Network Programming. The Sockets Networking API. W.R. Stevens, B. Fenner e A.M. Rudoff. Volume 1. Third Edition. Addison Wesley. 2013. 31