Cliente daytime

Propaganda
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
Download