Comunicação entre Comunicação entre Processos - Processos - Sockets Sockets
Comunicação entre Comunicação entre Processos - Processos -
SocketsSockets
Conceitos BásicosConceitos Básicos
Sockets são uma forma de IPC Sockets são uma forma de IPC ( InterProcess Communication ) fornecida ( InterProcess Communication ) fornecida pela 4.3 BSD que fornecem comunicação pela 4.3 BSD que fornecem comunicação entre processos residentes em sistema único entre processos residentes em sistema único ou processos residentes em sistemas ou processos residentes em sistemas remotos.remotos.
Conceitos BásicosConceitos Básicos
Sockets criados por diferentes programas Sockets criados por diferentes programas usam nomes para se referenciarem.usam nomes para se referenciarem.
Esses nomes geralmente devem ser Esses nomes geralmente devem ser traduzidos em endereços para uso.traduzidos em endereços para uso.
Um endereço é especificado por um Um endereço é especificado por um domínio.domínio.
Processo Usuário Processo Usuário
SO
IPC em um mesmo sistema
Processo Usuário Processo usuário
SO SO
Comunicação de Processos Remotos
Tipos de SocketsTipos de Sockets
– STREAM SOCKET - Provê sequenciamento e STREAM SOCKET - Provê sequenciamento e fluxo bidirecinal. Este tipo de socket transmite fluxo bidirecinal. Este tipo de socket transmite dados sobre um base confiável e com dados sobre um base confiável e com capacidade de transmissão de dados expressos.capacidade de transmissão de dados expressos.
– No domínio UNIX, o SOCKET_STREAM No domínio UNIX, o SOCKET_STREAM trabalha igual a um pipe, no domínio trabalha igual a um pipe, no domínio INTERNET este tipo de socket é implementado INTERNET este tipo de socket é implementado sobre TCP/IP.sobre TCP/IP.
Tipos de SocketsTipos de Sockets
– SOCK_DGRAM - Suporta fluxo de dados SOCK_DGRAM - Suporta fluxo de dados bidirecional mas não oferece um serviço bidirecional mas não oferece um serviço confiável como STREAM_SOCKET.confiável como STREAM_SOCKET.
– Mensagens duplicadas e em ordem diferente Mensagens duplicadas e em ordem diferente ( não sequenciadas ) são problemas que podem ( não sequenciadas ) são problemas que podem aparecer neste tipo de socket.aparecer neste tipo de socket.
Tipos de SocketsTipos de Sockets
– RAW_SOCKET - permite o acesso a interface RAW_SOCKET - permite o acesso a interface de protocolos de rede. Disponível para usuários de protocolos de rede. Disponível para usuários avançados e que possuam autoridade de usuário avançados e que possuam autoridade de usuário rootroot
– permite que uma aplicação acesse diretamente permite que uma aplicação acesse diretamente protocolos de comunicação de baixo nível.protocolos de comunicação de baixo nível.
– permite a construção de novos protocolos permite a construção de novos protocolos sobre os protocolos de baixo nível já existentes sobre os protocolos de baixo nível já existentes
– normalmente orientados a datagramanormalmente orientados a datagrama
AssociaçãoAssociação
O socket é criado sem nomeO socket é criado sem nome É necessário um nome para para a sua É necessário um nome para para a sua
utilizaçãoutilização Os processos são ligados por uma Os processos são ligados por uma
associaçãoassociação Associação: Associação: <protocolo, end. máquina local, porta local, end. <protocolo, end. máquina local, porta local, end.
máquina remota, porta remota>máquina remota, porta remota>
Domínios e ProtocolosDomínios e Protocolos
O espaço no qual o endereço é especificado O espaço no qual o endereço é especificado é chamado de domínioé chamado de domínio
Domínios básicos:Domínios básicos:» INTERNET - AF_INET - os endereços consistem INTERNET - AF_INET - os endereços consistem
do end. de rede da máquina e da identificação do no. do end. de rede da máquina e da identificação do no. da porta, o que permite a comunicação entre da porta, o que permite a comunicação entre processos de sistemas diferentesprocessos de sistemas diferentes
» Unix: AF_UNIX - os processos se comunicam Unix: AF_UNIX - os processos se comunicam referenciando um pathname, dentro do espaço de referenciando um pathname, dentro do espaço de nomes do sistema de arquivosnomes do sistema de arquivos
Domínios e ProtocolosDomínios e Protocolos
Domínio InternetDomínio Internet– Implementação Unix da protocolo TCP/UDP/IPImplementação Unix da protocolo TCP/UDP/IP– Consistem de:Consistem de:
» end. de rede da máquinaend. de rede da máquina
» identificação do no. da portaidentificação do no. da porta
– Permitem a comunicação entre máquinas Permitem a comunicação entre máquinas diferentesdiferentes
– Conexões sob a forma de sockets do tipo stream Conexões sob a forma de sockets do tipo stream e do tipo datagramase do tipo datagramas
Tipos de SocketsTipos de Sockets
Socket StreamSocket Stream– conexões confiáveisconexões confiáveis
DatagramasDatagramas– não fornecem segurançanão fornecem segurança
Protocolos TCP/IP
ProcessoA
ProcessoB
TCP UDP
IP
Interfacehardware
IP
• Internetwork Protocol• Roteamento de mensagens na rede• Unidade: datagramas• Fragmentação de pacotes (se > MTU)• Entrega não confiável de pacotes
TCP
• Transmission Control Protocol• Para comunicação longa (conexão)• Confiável• Transmissão de fluxo de dados: Não respeita limites de mensagens• Baixo desempenho em comunicações curtas (?)• Usos típicos:
• Login remoto• Transferência de arquivo
UDP
• User Datagram Protocol• Para comunicação curta (sem conexão)• Não confiável• Transmissão de pacotes: respeita limites de mensagens• Pouco prático para comunicações longas (confiabilidade precisa ser programada)• Usos típicos:
• RPC• Broadcast
Porta
• “Endereço” para um processo comunicante• Inteiro de 16 bits (definido pelo usuário)• Portas 1 a 1023 são do sistema• Portas de TCP independentes das de UDP
Associação
• Definida por
• Um protocolo: TCP ou UDP• Endereço IP local• Porta local• Endereço IP distante• Porta distante
Comunicação por sockets
Servidor Cliente 1
kernelkernel
socket socket
conexão
rede
Comunicação via TCP
Servidor
socket ( ) Cria um socket com - Família (ou domínio): UNIX, Internet, XNS - Tipo: stream, datagrama, puro - Protocolo (por conseq.): TCP, UDP
sockfd = (int) socket (int family, int type, int protocol)sockfd (int) = socket int) family int ,type int ,protocol(
Comunicação via TCP
Servidor
socket ( )
bind ( )
Atribui ao socket - Endereço Internet (pode ser “any”) - Porta de comunicação
ret = (int) bind (int sockfd, struct sockaddr *myaddr, int addrlen) ret = (int)bind int) sockfd struct sockaddr ,myaddr*int ,addrlen (
Comunicação via TCP
Servidor
socket ( )
bind ( )
listen ( )
Declara - Que está pronto para receber conexões - Até quantas devem ser enfileiradas
ret = (int) listen (int sockfd, int backlog) ret = (int)listen int) sockfdint ,backlog (
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
newsock = (int) accept (int sockfd, struct sockaddr *peer, int *addrlen)newsock (int) = accept int) sockfd* struct sockaddr ,peerint ,addrlen* (
• Bloqueia até que haja pedido de conexão• Quando houver algum, aceita
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
socket ( )
Cliente
• Cria um socket idêntico ao do servidor (mesma família e tipo)
sockfd = (int) socket (int family, int type, int protocol)sockfd (int) = socket int) family int ,type int ,protocol(
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
socket ( )
connect ( )
Cliente
• Pede uma conexão ao servidor• Fica bloqueado ou retorna erro• Se aceito, fecha a conexão
ret = (int) connect (int sockfd, struct sockaddr *servaddr, int addrlen)ret = (int)connect int) sockfd * struct sockaddr ,servaddr int ,addrlen(
estabelecimento de conexão
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
socket ( )
connect ( )
send ( )
estabelecimento de conexão
Cliente
• Envia uma seqüência de bytes pela conexão
nbytes = (int) send (int sockfd, char *buf, int nbytes, int flags)nbytes(int) = send int) sockfd * char ,buf int ,nbytes int ,flags(
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
recv ( )
socket ( )
connect ( )
send ( )
estabelecimento de conexão
solicitação
Cliente
• Recebe (parte da ) msg enviada por send ( )
nbytes = (int) recv (int sockfd, char *buf, int nbytes, int flags)nbytes(int) = recv int) sockfd * char ,buf int ,nbytes int ,flags(
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
recv ( )
send ( )
socket ( )
connect ( )
send ( )
recv ( )
estabelecimento de conexão
solicitação
resposta
processamento
Cliente
• Transmite ou confirma msgs faltantes• Encerra a conexão• Fecha o socket
close ( ) close ( )
ret = (int) close (int sockfd)ret = (int)close int) sockfd (
Comunicação via TCPServidor
socket ( )
bind ( )
listen ( )
accept ( )
recv ( )
send ( )
socket ( )
connect ( )
send ( )
recv ( )
estabelecimento de conexão
solicitação
resposta
processamento
Cliente
• Diagrama completo
close ( ) close ( )
Comunicação via UDP
Servidor
socket ( ) socket ( )
Cliente
• Cliente e servidor criam seus sockets• Família = Internet, tipo = datagrama
Comunicação via UDP
Servidor
socket ( )
bind ( )
socket ( )
bind ( )
Cliente
• Cliente e servidor definem endereços
Comunicação via UDP
Servidor
socket ( )
bind ( )
recvfrom ( )
socket ( )
bind ( )
Cliente
• Recebe pacote enviado do endereço informado• Se não houver nada, bloqueia
nbytes = (int) recvfrom (int sockfd, char *buf, int nbytes, int flags, struct sockaddr *from, int *addrlen)
nbytes(int) = recvfrom int) sockfd * char ,buf int ,nbytes int ,flags, * struct sockaddrfrom* int ,addrlen(
Comunicação via UDP
Servidor
socket ( )
bind ( )
recvfrom ( )
socket ( )
bind ( )
sendto ( )solicitação
Cliente
• Envia pacote para o endereço informado
nbytes = (int) recvfrom (int sockfd, char *buf, int nbytes, int flags, struct sockaddr *from, int *addrlen)
nbytes(int) = recvfrom int) sockfd * char ,buf int ,nbytes int ,flags, * struct sockaddrfrom* int ,addrlen(
Comunicação via UDP
Servidor
socket ( )
bind ( )
recvfrom ( )
sendto ( )
socket ( )
bind ( )
sendto ( )
recvfrom ( )
solicitação
resposta
processamento
Cliente
• Diagrama completo
close ( ) close ( )
MultiplexaçãoMultiplexação• Problema:
Servidor esperando conexão em vários sockets
Como aceitar a 1a que chegar?
MultiplexaçãoMultiplexação
• Soluções:
• Definir sockets não bloqueantes e fazer polling => busy wait• Criar um filho para cada socket• Usar I/O assíncrono (evento gera SIGIO) => programação não trivial• Função select ( )
Função select ( )
• maxfd indica o maior descritor a ser pesquisado• readfds é um vetor de bits, cada bit correspondendo a um descritor onde se espera uma entrada• writefds idem, se espera uma saída• exceptfds idem, se espera uma exceção• timeout define por quanto tempo o select espera
ret = (int) select (int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
ret = (int)select int) maxfd* fd_set ,readfds* fd_set ,writefds , * fd_setexceptfds* struct timeval ,timeout(
Função select ( )Função select ( )#include <sys/time.h>#include <sys/types.h>...fd_set readfds;struct timeval wait;...for (;;) { wait.tv_sec = 1; /* ajusta timeout para 1 seg */ wait.tv_usec = 0; FD_ZERO (&readfds); /* zera vetor de bits */ FD_SET (sd1, &readfds); /* liga bit correspondente ao socket 1 */ FD_SET (sd2, &readfds); /* liga bit correspondente ao socket 2 */ nb = select (FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, &wait); if (nb <= 0) { /* ocoreu erro ou expirou o timeout */ } if (FD_ISSET (s1, &readfds)) { /* socket 1 está pronto para ser lido */ } ...