Sistemas Operacionais de Rede APIs de Programação APIs para Acesso à Rede • I/O API – abrir, fechar, ler e escrever em arquivos remotos • Network API – conectar e navegar através de sistemas de arquivos remotos • Named Pipe e MailSlot API (Microsoft Win32) – troca de dados entre processos locais ou remotos • NetBIOS API – API compatível com soluções Novell, DOS, Windows e OS/2 antigas. • Sockets API – API compatível com o padrão Internet TCP/IP • Remote Procedure Call – API que permite construir aplicações distribuídas de forma transparente. APIs para Acesso a Rede • • • • Sockets NetBIOS API Named Pipes Remote Procedure Call Sockets Aplicações Protocolo de Aplicação FTP, SMTP, HTTP, Telnet, SNMP, etc. sockets TCP, UDP IP Data Link Ethernet, Token Ring, FDDI, etc Física • Conjunto de APIs mais difundido para programação sobre a arquitetura TCP/IP. Sockets • Desenvolvido para o UNIX versão Berkeley – Método padrão para conectar duas máquinas numa rede. – Oferece mecanismos para manipular o fluxo de dados bidirecional em uma conexão de rede virtual. – Padrão atual da Internet • Suporta serviços para: – protocolos orientados a conexão (TCP) – protocolos não-orientados a conexão (UDP) • Os seguintes protocolos usam Sockets: • NWLink, TCP/IP e AppleTalk Princípio • Sockets podem ser utilizados para efetuar comunicação sobre os protocolos TCP ou UDP. Servidor Comunicação bidirecional Porta Porta Cliente Fluxo de Funcionamento O servidor cria um socket O servidor passa a escutar uma porta N S Chegou requisição? Uma conexão bidirecional é criada com o cliente Mais de um cliente • O servidor pode utilizar a mesma porta para estabelecer várias conexões. • Cada cliente deve ser atendido por um thread separadamente. Thread Principal Servidor Thread Cliente 1 porta 1 porta 10 Thread Cliente 2 porta 1 porta 21 Cliente 2 Thread Cliente N porta 1 Cliente 1 porta 10 Cliente N Convenções de portas • Portas de servidor têm números < 1024 • Portas de cliente tem número >= 1024 • Até 64K portas são possíveis em um servidor • Portas servidoras são padronizadas por RFCs: – – – – – 22/TCP: SSH 25/TCP: SMTP 80/TCP: HTTP 161/UDP: SNMP ... API´s para Acesso a Rede • • • • Sockets NetBIOS API Named Pipes Remote Procedure Call Facility NetBIOS • NetBIOS (1983, IBM) define as seguintes entidades: – Uma interface de programação: • Um conjunto de APIs que permite que as aplicações se comuniquem através da rede. • NetBIOS é considerado uma facilidade IPC (Inter-Process Communication) • Corresponde a camada sessão do modelo OSI, podendo servir de interface homogênea para vários protocolos de transporte: TCP/IP, IPX/SPX, NetBEUI. – Um serviço de nomes para identificar os recursos na rede – Um serviço de transmissão por datagrama não confiável Inteface NetBIOS • O comandos NetBIOS se dividem em 4 tipos: – comandos de suporte a nomes • ADD GROUP NAME, ADD NAME • DELETE NAME • FIND NAME – comandos de suporte ao serviço de datagrama • • • • RECEIVE BROADCAST DATAGRAM: todas as estações RECEIVE DATAGRAM: estação específica SEND BROADCAST DATAGRAM : todas as estações SEND DATAGRAM : estação específica Interface NetBIOS (cont.) – comandos de suporte ao serviço orientado a conexão • • • • • CALL, HANG UP: início e fim da conexão lógica LISTEN: espera pedidos de conexões lógicas SEND, RECEIVE: troca de dados através de uma conexão RECEIVE ANY: recebe dados de qualquer conexão lógica SESSION STATUS: recebe informações das conexões lógicas ativas – comandos de serviço genérico • ADAPTER STATUS: obtém informações sobre o adaptador de rede. • CANCEL: cancela os comandos pendentes. • RESET: limpa as tabelas de nomes e sessões. Nomes NetBIOS • Utiliza nomes lógicos para identificar as estações num ambiente de rede. – Os nomes lógicos tem entre 1 e 15 caracteres de comprimento, e devem ser únicos – O comprimento máximo dos nomes é 16 caracteres. O 16o caracter é utilizado para identifica o tipo de recursos • nome de uma máquina, nome de um serviço, nome de um usuário, nome de um grupo, etc. • Os nomes permitem identificar as estações da rede de uma maneira mais amigável que os endereços de rede. API´s para Acesso a Rede • • • • Sockets NetBIOS API Named Pipes Remote Procedure Call Protocolo Orientado a Conexão • Protocolo Named Pipes – Implementa comunicação ponto a ponto com garantia de entrega. – Não permite enviar mensagens em broadcast. Processo Cliente Kernel REDE Processo Servidor PIPE Kernel O cliente endereça um mailbox criado pelo servidor – Mensagem solicitada: receive deve ser chamado antes. Protocolo MailSlot • Formato do Endereço (nome de arquivo) 1) \\.\pipe\[path]name • “.” indica a máquina local • [path]name indica o nome do mailslot 2) \\machine\pipe\[path]name • “machine” indica o nome (NEBIOS) da máquina API´s para Acesso a Rede • • • • Sockets NetBIOS API Named Pipes Remote Procedure Call Remote Procedure Call - RPC • API para implementar comunicação cliente-servidor entre processos. • Encapsula os mecanismos de IPC (Inter-Process Communication) convencionais na forma de chamada de procedimentos. • Simplifica o desenvolvimento e torna as aplicações independentes dos protocolos de comunicação utilizados. • É o método IPC mais flexível entre os existentes atualmente. • Utiliza os outros métodos IPC para manipular comunicações cliente/servidor: – NetBIOS, Named Pipes, Sockets Protocolo Cliente-Servidor • RPC (Remote Procedure Call) – Implementa comunicação ponto a ponto com garantia de entrega. – Não permite enviar mensagens em broadcast. – Independe do protocolo de transporte utilizado. requisição Processo Cliente Kernel REDE Processo Servidor resposta Kernel Remote Procedure Call • A) Princípio – Cliente RPC : computador que chama a função. – Servidor RPC : computador que executa a função. servidor RPC cliente RPC long Fatorial(short x) { ... } y= Fatorial(x) Rede x y resultado Processo Cliente e Servidor PROCESSO CLIENTE PROCESSO SERVIDOR Kdfh fg kghdh g k Dfh gkhdf gfh gf gf kg fdgh kdfh hgfghfgg Período que o processo permanece bloqueado. Chamada RPC fdkjgfd hf fg hkgd SUB-ROTINA EVOCADA DINAMICAMENTE dfgkd gfhfg fjg fdgd fgh fdgd ghfgfgdf fdgdfggfhfgd retorno Importante: o processo que efetua a chamada RPC permanece bloqueado durante a execução remota. Portabilidade UNIX SOLARIS UNIX LINUX • Observação: UNIX HPUX Windows NT Windows 95 Nao suporta named pipes nem binding automático – RPC são suportadas pela maioria dos sistemas operacionais. – Os mecanismos de RPC não são necessariamente compatíveis entre si. Padrão OSF-DCE • O padrão de RPCs mais difundido foi proposto pela OSF (Open Software Foundation) para redes heterogêneas • Os objetivos do padrão RPC OSF são: – permitir que máquinas com arquiteturas diferentes se comuniquem sem os problemas usuais como diferentes tamanhos de palavras. – permitir o uso da maioria dos tipos C (int, float, pointers, etc.). – suportar múltiplos protocolos de rede – esconder (encapsular) ao máximo as particularidades dos protocolos de rede. – oferecer ao programador a flexibilidade para determinar a quantidade de controle que será exercido sobre a conexão de rede (compromisso entre conveniência e eficiência). Chamada de Procedimento Local retorno = sub-rotina(parâmetro 1, parâmetro 2, etc.) Programa Principal 2) parâmetros 1) parâmetros SUB-ROTINA Call subrotina (parâmetros,...) 4) resultado 3) resultado PILHA Parameter marshalling Stubs Stub do cliente chamada Empacotamento de parâmetros Parameter unmarshalling Stub do servidor chamada Desempacotamento de parâmetros CLIENTE retorno SERVIDOR Desempacotamento de parâmetros Kernel REDE Empacotamento de parâmetros Kernel Transporte de mensagens pela rede retorno Arquitetura em Camadas CLIENTE SERVIDOR APLICAÇÃO APLICAÇÃO 1 14 8 7 SERVER STUB CLIENT STUB 2 13 CLIENT RUN-TIME LIBRARY 3 12 9 6 SERVER RUN-TIME LIBRARY 10 TRANSPORTE TRANSPORTE 11 4 5 Sequência de Eventos • 1) A aplicação cliente chama um procedimento local do stub ao invés do código que implementa realmente a função. • 2) O stub empacota os dados e chama a função da RPC run-time library para enviar a requisição e os parâmetros pela rede (3) e (4). • 5) A RPC run-time library do servidor aceita a requisição e chama o stub server (6). • 7) O stub server desempacota os dados e chama o procedimento real no servidor. B) Overhead de uma chamada RPC – A utilização de chamadas RPC introduz um overhead devido ao processo de marshalling e unmarshalling e ao tempo de transmissão das informações pela rede. chamada marshalling CLIENTE retorno chamada unmarshalling SERVIDOR unmarshalling Kernel Tempo consumido pelo STUB e pela Runtime Library marshalling retorno Kernel Tempo consumido para transmissão e recepção dos dados Considerações de Projeto • Um custo é introduzido devido ao tempo gasto para gerenciar a RPC (uma RPC é +/- 5000 vezes mais lenta que uma chamada local). – chamada local : ~ 1 microsegundo. – Chamada RPC: ~ 5 milisegundos. • Latência na execução da função – tempo gasto para transportar os dados pela rede. – custo do marshalling/unmarshalling – aproximadamente 5 milisegundos por chamada. Servidor RPC Multithreaded Cliente 1 Thread p/ cliente 1 Thread p/ cliente 2 Servidor RPC Cliente 2 SERVIDOR Cliente RPC multithreaded Cliente Thread principal Thread 1 Thread 2 parcela2 Call Fatorial(param1) Call fatorial(param2) parcela1 Calcula a Soma das parcelas e mostra o resultado = resultado1 + resultado2 Servidor 1 calcula primeira parcela do numero fatorial Servidor 2 calcula segunda parcela do numero fatorial C) Binding Manual e Automático • Servidor – O servidor deve sempre começar primeiro. – Ele fornece à máquina onde está sendo executado as seguintes informações: • quais protocolos de rede serão usados para comunicação com os clientes. • o nome dos “end-points” para os diferentes protocolos. Exemplos: – uma porta TCP em TCP/IP – um nome do tipo pipe\pipename em named pipes Protocolos Suportados • Dependendo do fabricante, vários protocolos podem ser suportados: – TCP/IP – NetBIOS sobre NetBEUI – NetBIOS sobre TCP – Named Pipes – SPX (Novell) – Local Interface e Servidor de Nomes • Com os protocolos e os endpoints estabelecidos, o servidor RPC registra uma interface para as funções que ele suporta. – uma interface é identificada por um UUID único do tipo: • 12345678-1234-ABCD-1234-0123456789AB • O servidor RPC pode registrar-se opcionalmente como um servidor de nomes. – O servidor de nomes RPC elimina a necessidade que os clientes conheçam o nome da máquina em que roda o RPC server. Operação do cliente – Para que um cliente possa executar uma RPC, ele deve primeiro se associar (bind) com o servidor RPC. – A operação de bind pode ser: • automática • manual. – O processo automático é mais fácil de implementar, mas é mais lento se o cliente tiver que efetuar várias chamadas sucessivas. – No caso de serem necessárias várias chamadas, o processo manual é preferível, pois o cliente pode conectar com o servidor uma única vez e efetuar todas as chamadas que precisa. Binding manual – O cliente RPC deve conhecer os dados do RPC server que vai utilizar: • nome da máquina • tipo de protocolo • nome do endpoint – O processo é feito em 3 fases: • conexão com o servidor (bind) • chamada da função • desconexão (unbind) – O programador dever escreve o código de binding no programa cliente. – Opcionalmente, o cliente RPC pode fazer uma consulta para o servidor de nomes e obter os dados do RPC server (assisted manual binding) BINDING MANUAL cliente servidor conexão chamada resposta PORTA desconexão CLIENTE PROTOCOLO, IP, PORTA, UUID SERVIDOR Binding automático – Neste modo, o programador do código do cliente não precisa escrever o código de binding. – Toda vez que um programa cliente chama uma função do RPC server, a RPC runtime library executa os seguintes procedimentos: • • • • • consulta o servidor de nomes RPC da rede determina o servidor RPC apropriado conecta (bind) com o servidor executa a chamada de procedimento remoto desconecta (unbind) do servidor BINDING AUTOMÁTICO 3 cliente servidor conexão chamada resposta PORTA desconexão CLIENTE SERVIDOR UUID 1 2 PROTOCOLO, IP, PORTA UUID, PROTOCOLO,IP, PORTA SERVIDOR DE NOMES Desenvolvimento com RPC Código do Cliente Arquivo IDL Stub do Cliente Compilador C Compilador MIDL Arquivo ACF Stub do Servidor Código do Servidor Compilador C