28
II - UFRGS Programação em Sockets visando verificar a diferença entre transmissão confiável (TCP) e não confiável (UDP) Universidade Federal do Rio Grande do Sul (UFRGS) Instituto de Informática Valter Roesler

Programação em Sockets visando verificar a diferença entre ...roesler/disciplinas/LabRedes/03_Sockets/Apresent... · “esqueleto_udp”. Testar programa como está. Transformar

Embed Size (px)

Citation preview

II -

UF

RG

S

Programação em Sockets visando verificar a

diferença entre transmissão confiável (TCP) e não

confiável (UDP)

Universidade Federal do Rio Grande do Sul (UFRGS)

Instituto de Informática

Valter Roesler

2

II-U

FR

GS

Agenda

Conceitos sobre sockets

Sockets UDP

Sockets TCP

3

II-U

FR

GS

Conceito de Sockets

Uma forma de IPC (Inter-process communication).

Processo Usuário Processo Usuário

SOCKET Processo Usuário

Processo usuário

SOCKET SOCKET

4

II-U

FR

GS

Base

Onde ficam os sockets no modelo OSI?

O que é fim-a-fim?

O que é confiável e não confiável?

O que é conexão / conexionless?

O que é Datagrama?

5

II-U

FR

GS

Associação

Os processos são ligados por uma associação formada por:

Protocolo (TCP/UDP)

Endereço e Porta

Endereço e Porta remota

Servidor Cliente

socket socket

kernel kernel

6

II-U

FR

GS

Inicialização do Socket

sockfd = (int) socket (int family, int type, int protocol)

socket()

ServidorCria um socket com

- Família (ou domínio): UNIX, Internet, ...

- Tipo: stream, datagrama, puro

- Protocolo (por conseq.): TCP, UDP

7

II-U

FR

GS

int socket (int domain, int type, int protocol);

int domain

AF_UNIX

AF_INET

AF_INET6

int type

SOCK_STREAM

SOCK_DGRAM

SOCK_RAW

int protocol

Depende do domínio. Normalmente se usa o valor ZERO

8

II-U

FR

GS

Domínios

AF_UNIX: Usado no domínio local. Mesma máquina.

AF_INET: Usado no domínio da Internet (IPv4). Podendo ser a mesma máquina ou em máquinas diferentes.

AF_INET6: Mesmo domínio do AF_INET, porém usando o IPv6.

9

II-U

FR

GS

Tipos de Sockets (SOCK_DGRAM)

Comunicação não confiável.

Usa o protocolo UDP

Envio das mensagens não garantidamente seqüenciais.

Usado em transmissões Multicast, transmissão de vídeos, ...

10

II-U

FR

GS

Tipos de Sockets (SOCK_STREAM)

Fornece uma comunicação confiável.

Usa o protocolo TCP.

As mensagens são seqüenciadas.

Uso adequado para transmissões de dados que requeiram confiabilidade. Exemplo:

Transferência de arquivos (FTP, HTTP);

Envio de e-mail (SMTP, POP3)

Login Remoto (SSH)

11

II-U

FR

GS

Tipos de Sockets (SOCK_RAW)

Permite acesso do pacote diretamente à aplicação, eliminando a passagem pelo encapsulamento TCP/IP. Assim, a aplicação é responsável por eliminar e tratar os cabeçalhos.

Pode ser usado para criar um sniffer de redes (entretanto, normalmente os analisadores de rede utilizam a API do pcap / winpcap).

12

II-U

FR

GS

Inicialização no servidor

(quem aguarda a mensagem)

ret = (int) bind (int sockfd, struct sockaddr *myaddr, int addrlen)

Atribui ao socket

- Endereço Internet (pode ser “any”, significando

“recebe de qualquer IP” da máquina – usado quando

possui mais de uma placa de rede)

- Porta de comunicação (zero se atribuído

dinamicamente pelo sistema)

socket()

bind()

Servidor

13

II-U

FR

GS

int bind (int s, struct sockaddr *name, int namelen);

int s

Valor retornado em socket()

struct sockaddr *name

name.sin_family = AF_INET;

name.sin_addr.s_addr = INADDR_ANY; // qq IP da máquina; network order*

name.sin_port = htons(0); // 0 = atribuição dinâmica; network order*

int namelen

Tamanho da estrutura “name” = (sizeof(name))

* Ordenamento dos bytes para 0x102 (hexadecimal)

Default é ordenamento de “host” (“byte order”): primeiro MSB: “01 02”

Ordenamento de “network”: último MSB: “02 01”. Htons = “Host to Network Short”

14

II-U

FR

GS

Exemplo

struct sockaddr_in peer; SOCKET s; int porta, peerlen; … memset((void *)&peer, 0, sizeof(struct sockaddr_in)); // zera estrutura peer.sin_family = AF_INET; peer.sin_addr.s_addr = htonl(INADDR_ANY); // Recebe de qualquer IP peer.sin_port = htons(porta); // Recebe na porta especificada na linha de comando peerlen = sizeof(peer); // Associa socket com estrutura peer if(bind(s,(struct sockaddr *) &peer, peerlen)) { printf("Erro no bind\n"); exit(1); }

15

II-U

FR

GS

Comunicação via UDP

- Cliente e servidor definem endereços

socket()

bind()

Servidor

socket()

Cliente

16

II-U

FR

GS

Comunicação via UDP

nbytes = (int) recvfrom (int sockfd, char *buf, int nbytes, int flags, struct sockaddr *from, int

*addrlen)

- Recebe pacote enviado do endereço informado

- Se não houver nada, bloqueia

socket()

bind()

Servidor

socket()

Cliente

recvfrom()

OBS: No recvfrom a estrutura *from é atualizada para conter o IP do transmissor. Dessa forma já se sabe para quem enviar a resposta.

17

II-U

FR

GS

Comunicação via UDP – Diagrama completo

socket()

bind()

Servidor

socket()

Cliente

recvfrom() sendto()

sendto() recvfrom()

close() close()

solicitação

resposta

18

II-U

FR

GS

FAZER EXERCÍCIO DE UDP

19

II-U

FR

GS

Sockets TCP

Sockets TCP necessitam uma “conexão” antes da troca de dados

Servidor se prepara para receber (listen) antes de começar a receber (accept)

Cliente se conecta (connect) antes de transmitir

Troca de dados se dá por “write” e “read”

20

II-U

FR

GS

Comunicação via TCP

ret = (int) listen (int sockfd, int backlog)

Listen declara:

- Que está pronto para receber conexões

- Até quantas consultas podem ser enfileiradas, ou seja, o

comprimento da fila de espera de novos pedidos

socket()

bind()

listen()

Servidor

int sockfd

Valor retornado por socket()

int backlog

comprimento da fila de espera de novos pedidos de ligação.

21

II-U

FR

GS

Comunicação via TCP – Accept

newsock = (int) accept (int sockfd, struct sockaddr *peer, int *peerlen)

Accept:

- Bloqueia até que haja pedido de conexão

- Quando houver algum, aceita socket()

bind()

listen()

accept()

Servidor

int sockfd

Valor retornado por socket()

struct sockaddr *peer

Recebe o endereço da conexão

int *peerlen

Tamanho (sizeof) da struct peer

22

II-U

FR

GS

Comunicação via TCP – Cliente

sockfd = (int) socket (int family, int type, int protocol)

- Cria um socket idêntico ao do servidor (mesma família e tipo)

socket()

bind()

listen()

accept()

socket()

Servidor

Cliente

23

II-U

FR

GS

TCP necessita conexão – Connect

ret = (int) connect (int sockfd, struct sockaddr *servaddr, int peerlen)

- Pede uma conexão ao servidor

- Fica bloqueado ou retorna erro

- Se aceito, estabelece conexão socket()

bind()

listen()

accept()

socket()

connectEstabelece

conexão

Cliente

struct sockaddr *servaddr

Dados para quem irá se conectar.

int peer_len

Tamanho (sizeof) de peer

24

II-U

FR

GS

Comunicação via TCP – Recv e Send

nbytes = (int) recv (int sockfd, char *buf, int nbytes, int flags)

- Recebe (parte da ) msg enviada por send ( ) socket()

bind()

listen()

accept()

recv()

socket()

connect

send()

Estabelece

conexão

solicitação

Servidor

Cliente

25

II-U

FR

GS

Comunicação via TCP – Diagrama completo

ret = (int) close (int sockfd)

- Transmite ou confirma msgs faltantes

- Encerra a conexão

- Fecha o socket socket ()

bind ()

listen ()

accept ()

recv ()

socket ()

connect

send ()

send () recv () Processamento

close () close ()

Estabelece

conexão

solicitação

resposta

Servidor

Cliente

26

II-U

FR

GS

Exercício de UDP

O aluno deve enviar no relatório o seguinte:

Documento explicando o algoritmo utilizado mostrando todo o código (as partes principais do código devem obrigatoriamente estar detalhadas no relatório), o ambiente e a linha de comando para uso dos programas e imagens mostrando o resultado de sua execução. Essas imagens podem ser obtidas através do programa “Netmeter EVO” ou “DU Meter” ou “Netmeter” ou pelo gerenciador de tarefas ou outro método equivalente. Adaptar o código (limpar o mesmo), e não simplesmente deixar o original cheio de comentários. Utilizar bit/s nos gráficos (e não bytes/s).

Códigos EXECUTÁVEIS;

Códigos FONTE.

EXERCÍCIO UDP (5 pts) Verificar as estruturas analisadas no diretório “esqueleto_udp”. Testar programa como está. Transformar o transmissor para enviar um número bits/s na rede (evitando rajadas) de acordo com as seguintes linhas de comando:

“-r n”: onde n = multiplicação da idade da dupla em kbit/s. Por exemplo, se os dois possuem 20 anos, deve ser 400 kbit/s. O relatório deve especificar nome e idade de cada componente.

“-r 2000”: 2 Mbit/s

“-r 4000”: 4Mbit/s

27

II-U

FR

GS

Exercício de TCP

Valem mesmas dicas de relatório da semana passada (Explicar algoritmo, código,

mostrar as imagens, ...)

(5 pts) Verificar as estruturas analisadas no diretório “esqueleto_tcp”. Testar

programa como está. Analisar equidade do tráfego na rede, alterando o programa

para ficar enviando dados na máxima velocidade possível. Gerar gráfico.

Gerar gráfico de adaptação na rede utilizando pelo menos duas conexões e três

máquinas. Uma máquina roda dois processos servidores em portas diferentes. Cada

processo (numa janela de terminal separada) conecta a um cliente. Os clientes estão

localizados em máquinas separadas. Gerar gráfico.

Gerar log com a média de tráfego por segundo e refazer gráfico para três

conexões. Nesse caso, utilizando apenas duas máquinas e utilizando o log para

gerar o gráfico.

Adaptar o programa para ficar mais eficiente: porta e IP como parâmetro de entrada,

eficiência no laço, tamanho de buffers, limpeza de código, documentação, etc.

28

II-U

FR

GS

Sugestões de exercícios extras (não precisa fazer)

Os exercícios podem ser efetuados com base nos esqueletos da página. Devem ser efetuados em linguagem C para que se visualize bem a utilização dos sockets.

Sockets TCP: Criar programa cliente de http simples, ou seja, que conecte na porta 80 de um servidor http qualquer e efetue o comando “GET”. Entrada: endereço web do servidor http. Saída: página inicial obtida com o comando GET.

Sockets UDP: Criar programa de chat entre dois ou mais computadores via UDP. Cada usuário deve ter condições de enviar mensagens. Na entrada, o usuário deve digitar um “apelido” que deve aparecer em cada mensagem sua. As mensagens devem ser enviadas a todos.