Architettura e servizi Internet
Transcript
Architettura e servizi Internet
Architettura e servizi Internet Laboratorio di Sistemi Operativi Corso di Laurea in Informatica Università degli Studi dell'Aquila A.A. 2011/2012 Romina Eramo materiale tratto da: Fazio Vincenzo e-mail: [email protected] EURIX Group Corso Tortona, 17 Torino +39 011 8392311 • 10153 Torino www.eurix.it Indice ■ Internet: la storia ■ Architettura Internet ■ Protocollo di Rete: IP (Internet Protocol) ■ Protocolli di Trasporto: TCP, UDP ■ Servizi Internet ■ Applicazioni distribuite: programmazione socket Internet : la storia completamento dell’Internet Protocol Suite, di cui i due protocolli più noti sono il TCP e l’IP ARPA + Università di Stanford iniziano il progetto di una suite di protocolli standard create il numero delle reti inizia a crescere Nascita di Internet : ARPANET (prima rete di calcolatori a commutazione di pacchetto) Avvio delle ricerche di DARPA (Defense Advanced Research Project Agency) negli USA 1960 1970 1970-73 tempo 1973 1979 Internet : la svolta Svluppo del primo browser: Mosaic Gli standard Web definiscono: ➤ indirizzamento: Uniform Resource Locator (URL) ➤ protocollo: Hyper Text Transfer Protocol (HTTP) ➤ codifica: Hyper Text Markup Language (HTML) marzo 1989: invenione del Web. Tim Berners-Lee del CERN di Ginevra propone il servizio WWW periodo di notevole crescita di Internet 1980 1989 1993 tempo Internet…come funziona router Rete 1 Rete 2 router Rete 4 router Rete 3 Internet ■ ■ Internet consiste di un insieme di reti interconnesse che possono essere considerate come un'unica entità Le reti sono collegate da particolari apparati detti Router, che hanno come funzione primaria quella di instradare i dati sulla base dell'indirizzo della rete destinataria Router Router Network 2 Network 1 Network 3 Come individuare un computer sulla rete? IP – Internet Protocol ■ Host e router sono collegati nella rete attraverso link fisici e comunicano tramite un’ interfaccia ■ Ciascun router e host è in grado di inviare e ricevere, il protocollo IP richiede che ciascuna interfaccia abbia un indirizzo IP ■ Interfaccia: è il confine tra host e collegamento fisico. ■ Indirizzo IP: ogni interfaccia di host e router di Internet ha un indirizzo IP globalmente univoco IP – Internet Protocol I router devono necessariamente essere connessi ad almeno due collegamenti ■ Un host, in genere, ha un’interfaccia ■ A ciascuna interfaccia sono associati indirizzi IP a 32 bit ■ Indirizzamento IPv4 ■ ■ Un “indirizzo IP” (IP address) è un numero di 32 bit (4 byte) che identifica in modo univoco un host TCP/IP su Internet o in una intranet. Un indirizzo IP è composto da: ● Un ID di rete (bit più a sinistra) ● Un ID di host (bit più a destra) Net ID IP Address Host ID Indirizzamento IPv4 ■ Esempi di indirizzi IP 120 Host ID Net ID IP Address Host ID Net ID IP Address Net ID IP Address 188 201 01111000.01111001.10111100.11001001 128 121 188 201 121 Host ID 10000000.01111001.10111100.11001001 195 121 188 201 11000011.01111001.10111100.11001001 Indirizzamento IPv4 Classi di indirizzamento: ■ Le classe di indirizzamento sono 5 e sono individuate con le prime cinque lettere dell’alfabeto. ■ Gli indirizzi di classe D ed E sono poco usati. Classe A Classe C Net ID Host ID Net ID Host ID 120 121.188.201 195.121.188 121 Classe B Net ID Host ID 128.121 188.201 IP Address IP Address IP Address Indirizzamento IPv4 Classi di indirizzamento Classe A 0 1.0.0.0 – 127.255.255.255 ID net Classe B 1 0 Classe C 1 1 0 Classe D 1 1 1 0 Classe E 1 1 1 1 1 7 bit 24 bit host ID 128.0.0.0 – 191.255.255.255 14 bit net ID 16 bit host ID 192.0.0.0 – 223.255.255.255 21 bit net ID host ID 28 bit 224.0.0.0 – 239.255.255.255 multicast group ID 28 bit 240.0.0.0 – 255.255.255.254 reserved 27 bit Indirizzamento IPv4 Classe A Host ID Net ID Reti disponibili Host disponibili 126 16777214 IP Address Reti disponibili Host ID Net ID Classe B Host disponibili 16384 65534 IP Address Net ID Host ID Classe C IP Address ■ Reti disponibili Host disponibili 2097152 Alcuni indirizzi IP sono riservati: (per un elenco completo [http://ds.internic.net]) ● L’indirizzo 127 della classe A è usato a fini di diagnosi degli adattatori di rete ● Gli indirizzi 0 e 255 sono riservati negli ID di host. 254 Architettura Internet L'Interna*onal Organiza*on for Standardiza*on (ISO) nel 1979 ha definito la pila di protocolli Open Systems Interconnec*on (OSI), con l'intenzione di creare uno standard per le telecomunicazioni da usare nelle re* di tuBo il mondo ■ All'aBo pra*co però, lo standard de facto che viene comunemente usato nella maggior parte delle re*, è il TCP/IP ■ modello modello ISO-‐OSI TCP/IP Applicazione Applicazione Presentazione Sessione Non previsto Trasporto TCP/UDP Rete IP Collegamento Da* Fisico Network Access Architettura Internet Livello Applicativo Livello Applicativo TCP/UDP TCP/UDP Internet Protocol Connessione virtuale Network Access Internet Protocol Network Access Internet Architettura Internet TCP/UDP DATI APP APP DATI TCP/ UDP TCP/ UDP IP IP netw. netw. netw. netw. IP TCP/UDP DATI netw. IP TCP/UDP DATI Host A DATI TCP/UDP DATI IP TCP/UDP DATI netw. IP TCP/UDP DATI Host B netw. IP TCP/UDP DATI netw. IP TCP/UDP DATI Internet Strato di accesso alla Rete ■ Ha lo scopo di garantire il corretto interfacciamento verso una specifica rete, in modo da rendere lo strato superiore indipendente dalle caratteristiche fisiche della rete stessa. Network Access Network Access Internet Internet Protocol (IP) ■ ■ Il protocollo IP è responsabile dell’instradamento dei datagram da un host all’altro Le funzioni principali del protocollo IP sono: ● In trasmissione u Incapsula in datagram i dati provenienti dallo strato di trasporto u Prepone l’opportuna intestazione u Applica algoritmo di routing u ● unità elementare delle informazioni trasmesse contenente i dati che servono a trasportare l’informazione dal mittente al destinatario Invia i dati verso l’opportuna interfaccia di rete. In ricezione u Verifica la validità del datagram in arrivo u Esamina l’intestazione u Verifica se sono dati da reinstradare u Se sono dati locali, sceglie l’opportuno protocollo dello strato di trasporto e provvede ad inviarglieli nel formato opportuno. ■ Header IP Formato datagram di IPv4 0 4 Versione Lunghezza intestazione 8 16 Tipo di servizio Lunghezza totale del datagram (byte) Identificatore a 16 bit Tempo di vita 32 Indicatori Protocollo dello strato superiore Offset frammento (13 bit) Checksum intestazione Indirizzo IP sorgente a 32 bit Indirizzo IP destinatario a 32 bit Opzioni IP (se presenti) DATI Padding (necessario a completare i 32 bit) ● ● Header: 20-64 byte Dati + header <= MTU (Maximum Trasmission Unit), altrimenti si ha la frammentazione ■ Source address: indirizzo IP mittente ■ Destination address: indirizzo IP del destinatario ■ Protocol: protocollo di trasporto ■ Fragment offset: offsetdel frammento dll’ambito del totale dei dati da trasmettere ■ Identification: identificativo del datagramm ■ Flag: indica se il datagram rappresenta un frammento ■ Time-to-Live (TTL): numero di router che un datagram può attraversare ■ Header checksum: controllo errore sull’header IHL: lunghezza dell’header ■ ■ Total lenght: lunghezza totale Campi fondamentali del datagram IPv4 ■ Header IP Il datagram IP ha una lunghezza variabile: Strato di Trasporto ■ Lo strato di trasporto fornisce il servizio di trasporto dei messaggi dello strato di applicazione fra le estremità client e server di un’applicazione ■ Lo scopo principale è quello di fornire una comunicazione end-to-end a livello di processi ■ Il software di questo strato è responsabile del meccanismo che permette di distinguere, all’interno dello stesso host, il processo applicativo destinatario (o sorgente) dei dati ■ Ogni elaboratore contiene un insieme di punti logici di accesso “ports” (porte) ■ Ad ■ ogni servizio è associato un port number differente che consente di indirizzare il processo che realizza il servizio (server) Nell’architettura Internet esistono due standard principali di protocolli di trasporto: ● User Datagram Protocol (UDP - rfc768) ● Trasmission Control Protocol (TCP - rfc793) Trasporto UDP ■ Il protocollo UDP (User Datagram Protocol) consente alle applicazioni di scambiare messaggi singoli (protocollo Message oriented) ■ Servizio di trasporto fornito: ● Non affidabile Connessionless ● Flusso di dati strutturato a messaggi ● Non supporta meccanismi di riscontro e recupero d’errore ● ■ Può essere utilizzato per trasmissioni multicast (a differenza di TCP) ● stesso messaggio UDP a più destinazioni, indirizzate attraverso un indirizzo multicast <IP multicast address, UDP port> ■ Aggiunge solo due funzionalità a quelle di IP ● multiplexing delle informazioni tra le varie applicazioni tramite il ● checksum per verificare l’integrità dei dati Header UDP ● Port sorgente, port destinazione ● Campo per eventuali checksum Trasporto TCP ■ Il protocollo TCP (Transmission Control Protocol) è un protocollo end-to-end con connessione e offre un servizio stream-oriented affidabile ■ Trasferisce un flusso informativo bi-direzionale non strutturato (byte stream) tra due host ed effettua operazioni di multiplexing (in trasmissione) e de-multiplexing (in ricezione) ■ Servizio di trasporto fornito: ● Affidabile u Integrità u Rispetto della sequenza u Assenza di duplicati ● Orientato alla connessione ● Flusso di dati orientato al byte ● Header TCP Port sorgente, port destinazione Informazione per la gestione della connessione ● Informazioni per il ontrollo ed il recupero degli errori ● 0 4 8 Header TCP (Port address) Header IP (IP address) 16 Source Port HLEN TCP data IP data 24 Destination Port Sequence Number Acknowledegment Number Reserved Code bits Window Checksum Urgent Pointer Options (if any) Padding Data Data 31 Stato di Trasporto ■ La divisione dei compiti fra lo stato di trasporto (UDP, TCP) e IP è la seguente: ● ● ■ Il stato IP si occupa del trasferimento dei dati fra elaboratori collegati alla rete (l’intestazione IP identifica gli host sorgente e destinatario) Lo strato UDP (TCP) si occupa dello smistamento dei dati fra sorgente e destinatario all’interno dello stesso host (tramite il port number) Per richiedere un servizio, fornito da un processo residente su host remoto, il client deve conoscere il port number associato al servizio stesso Modello Client/Server ■ Architettura fondamentale su cui si basa gran parte della programmazione di rete in ambiente UNIX ■ Processo ● Server Rappresenta un programma che mette a disposizione un certo servizio (ad esempio: ftp, mail, ecc.) ■ Processo ● Client È un programma che chiede l’esecuzione di un servizio ad un processo server. NOTA: tipicamente il processo client si interfaccia con l’utente al terminale, invia dati al processo server, li riceve e li propone all’utente ■ Modello Client/Server Server concorrente - protocollo TCP ● Il socket di comunicazione viene creato automaticamente quando viene accettata la connessione. ■ Servizio FTP Server Internet File Transfer Protocol To = 21, dest addr Connect(to) ftp ? File Transfer Protocol ? Accept() 21 ftpd ftpd ftp Il servizio FTP viene offerto da un demone che funge da server e viene utilizzato da un programma client in grado di comunicare attraverso il protocollo FTP ftpd Modello Client/Server ■ Server concorrente - protocollo UDP ● ■ Il socket di comunicazione viene creato dal programma server Servizio tftp tftp To = 69, dest addr sendto(msg,to) ? Trivial File Transfer Protocol ? tftp TFTP è un protocollo di trasferimento file molto semplice, con le funzionalità di base del FTP Server Internet Trivial File Transfer Protocol 69 tftpd ? tftpd ? tftpd L’Architettura Internet FTP DNS Telnet HTTP FTP DNS Telnet HTTP UDP/TCP UDP/TCP IP Network Access IP Network Access Internet I servizi Internet ■ I dati sono trasmessi a pacchetto: ciascun blocco di dati è preceduto da intestazioni che specificano: ● a quale macchina sono diretti (protocollo IP) ● da quale programma debbono essere utilizzati (protocolli TCP/UDP) IP TCP/UDP header header 20 byte 20 byte data IP individua l'host Internet TCP/UDP individua uno dei SMTP processi attivi sull'host Telnet FTP I servizi Internet ■ I servizi inizialmente previsti per Internet erano: ● ● ftp (trasferimento file): permette di trasferire file tra macchine interconnesse ● e-mail (posta elettronica): permette di scambiare messaggi tra utenti della rete ● ■ telnet (terminale remoto): permette ad una macchina di essere vista come un terminale connesso all’host destinazione. …… Questi servizi erano caratterizzati da un’ interfaccia utente poco amichevole. I servizi Internet ■ Domain Name System (DNS) ■ Telnet ■ Ftp Domain Name System (DNS) ■ Il Domain name System (DNS) è alla base della risoluzione dei nomi di Internet [www.ssgrr.it] 195.31.235.39 ■ Il DNS è ● un database distribuito implementato in una gerarchia di server dei nomi ● un protocollo dello strato di applicaziome che permette agli host di comunicare ocn I server dei nomi in modo da fornire il servizio di traduzione ■ Il sistema dei domini su Internet è una gerarchia mondiale amministrata dall’interNIC (Internet Network Information Center) Domain Name System (DNS) ■ ■ ■ Quando Internet era costituito solo da pochi computer (ed era conosciuto con il nome di ARPANet) la risoluzione dei nomi poteva essere gestita da un unico computer che si trovava allo Stanford Research Institute (SRI). Il file conservato nell’SRI si chiamava HOST ed altro non era che un elenco di associazioni (indirizzo IP, nome del computer) Con l’aumentare del numero dei computer connessi in rete si è reso necessario escogitare un nuovo sistema: DNS (Domain Name System) Domain Name System (DNS) ■ ■ ■ Il DNS risolve i nomi di computer in indirizzi IP attraverso file configurati manualmente, usando un database gerarchico di nomi che viene conservato su più computer La natura gerarchica garantisce maggiore efficienza in termini di velocità e manutenibilità Il DNS è un servizio definito nelle Request For Comments (RFC) 882 e 883 di Internet. Indirizzi: [http://ds.internic.net/rfc/rfc882.txt] [http://ds.internic.net/rfc/rfc883.txt] Spazio dei nomi di dominio Domain Name Service ■ Rappresenta la struttura dei dati che creano il DNS utilizzato su Internet. ■ La gerarchia dei nomi ha molti livelli, e sono molti i computer che definiscono un livello. ■ Al livello “radice” ci sono i server dei nomi radice, mantenuti dall’InterNic. ■ La maggior parte dei server DNS è configurata con gli indirizzi IP dei server radice (root) Spazio dei nomi di dominio ■ Il secondo livello è rappresentato da domini “top” come: .com, .net, .gov, .org, .edu, .mil, .int, .xx ■ .com Organizzazioni commerciali ■ .edu Organizzazioni nel campo istruzione ■ .gov Enti pubblici e governativi ■ .int Organizzazioni internazionali .mil Enti militari .net Organizzazioni di networking .org Organizzazioni non commerciali ■ ■ ■ ■ Sotto i livelli “root”e “top” si trovano molti altri livelli. Spazio dei nomi di dominio Server di nome InterNIC del dominio radice mil af org army phoenix good net internic edu com harvard sam it microsoft ftp ssgrr www Spazio dei nomi di dominio ■ Il nome della singola macchina è il livello più basso ■ Il percorso completo dal livello radice a quello della macchina è conosciuto coma FQDN (Fully Qualified Domain Name) ■ Il FQDN va dal nome della macchina verso quello della root Risoluzione dei nomi ■ ■ La risoluzione dei nomi di dominio è simile a quella dei nomi host cioè la conversione da un nome “amichevole” in indirizzo IP Quando si usa il DNS i client chiamano un server DNS per la risoluzione dei nomi client www.ssgrr.it 195.31.235.39 Server DNS o Server dei nomi Risoluzione dei nomi it www.ssgrr.it 195.31.235.39 ssgrr.it 198.123.242.12 123.234.23.134 … 195.20.273.56 … com edu 198.123.252.12 123.234.24.134 … 195.31.279.123 … abc xyz 195.31.235.12 195.31.235.12 … 195.31.235.39 … it ssgrr xxx ftg www Telnet ■ La telnet è un’applicazione che permette il dialogo tra la macchina locale ed una remota tramite il protocollo TCP/IP. ■ Più semplicemente la Telnet permette di aprire sul proprio computer una finestra di terminale remota, ovvero una sessione Telnet ad un host remoto ■ Il programma Telnet implementa la parte client del protocollo. I client Telnet sono stati disponibili sulla maggior parte dei sistemi Unix per parecchi anni e ora sono disponibili per qualsiasi tipo di computer ■ Telnet Telnet Client TCP Internet Protocol Network Access port: 23 Virtual connection Internet Telnet Server TCP Internet Protocol Network Access Ftp ■ ■ ■ Ftp è l’acronimo di File-Transfer-Protocol, il protocollo utilizzato per il trasferimento dei file Con l’Ftp è possibile copiare da un computer remoto un file sull’hard-disk locale e viceversa E’ basato sul protocollo TCP/IP Ftp port 1173 port 1174 FTP (Client) TCP Internet Protocol Network Access Commands Responses Control connection Data connection Data ACKs Internet port 21 FTP (Server) TCP Internet Protocol Network Access port 20 Ftp ■ Fase di connessione ● Il client FTP apre una connessione TCP e si autentica Il server FTP accetta la richiesta di connessione e verifica autenticazione ● Se l’ autenticazione è OK il server si mette in attesa di ricevere comandi sulla connessione di controllo (port = 21) ● ■ Trasferimento di un file Il client richiede il file da trasferire all’FTP server. ● Il server accetta la richiesta in relazione alle protezioni del file-system relative al file. ● ● ● Se la richiesta viene accettata il server stabilisce la connessione (dal port 20 a un port dinamico del client definisce) La connessione dati è mantenuta per il tempo necessario al trasferimento del file Ftp ■ Operazioni FTP ● ● ● Sul server la connessione per il controllo avviene sul port 21, mentre i dati vengono trasferiti sul port 20 Il client invia al server il proprio indirizzo IP ed il numero del port sul quale il server dovrà stabilire la connessione dati Il server stabilisce la connessione Ftp ■ FTP options Tipi di dati : ASCII, EBCDIC, binari ● Tipi di file : strutture di file, di record, di pagine ● Modalità di trasmissione : stream, block, compressi. ● ■ Tipi di dati: ● ASCII (default) EBCDIC (opzionale) ● IMAGE : supporta efficientemente il trasferimento di file binari ● ● LOCAL : usato per specificare una dimensione logica di byte da trasferire Ftp Comandi ABOR LIST listafile Descrizione Abortisce comando FTP ed il trasferimento di dati Mostra la lista dei file o delle directory Password sul server PASS passwd PORT QUIT RETR nomefile STOR nomefile SYST TYPE tipo USER username Indirizzo del client IP Uscita (logoff) dal server Recupera un file dal server (get) Memorizza un file sul server (put) Tipo di sistema (restituito dal server) Specifica del tipo di file (e.g. A=ASCII; I=Immagine) username sul server ftp Ftp da prompt di comando Ftp FTP server windows Ftp FTP client windows Ftp Il browser-web come client ftp Il World Wide Web ■ Architettura di un’applicazione Web Tier 1 Tier 2 Browser HTTP 135.31.235.200 TCP IP prot. acc. rete http://135.31.235.13:80 pagina HTML Web Server HTTP TCP IP Internet prot. acc. rete pagine HTML 135.31.235.13 Applicazioni distribuite ■ La programmazione mediante socket ● ● Interfaccia socket. non è un livello ma una u Libreria di accesso ai servizi di trasporto Alternativa: TLI (Transport Layer Interface) FTP DNS Telnet HTTP Interfaccia socket UDP/TCP IP Network Access ■ Struttura di un’applicazione Modello senza connessione ● ● ■ Predisposizione transport-endpoint u Rilascio transport-endpoint Modello con connessione ● Predisposizione transport-endpoint u u ● ■ Scambio messaggi Instaurazione connessione Ø Scambio messaggi Abbattimento connessione Rilascio transport-endpoint Predisposizione transport-endpoint u u System call socket() System call bind() System Call socket() ■ ■ Il socket costituisce la struttura dati che consente la ricezione e l’invio dei messaggi. È definito in un dominio ogni socket è associato un nome che ha validità solo all’interno del dominio di comunicazione in cui il socket è stato creato. ■ Ad ■ Un socket viene creato dalla System Call socket(). S = socket(domain, type, protocol) int s, domain, protocol; ■ La System call restituisce un identificatore che verrà poi utilizzato nelle successive system call o funzioni per referenziare il socket. ■ Eventuali processi figli hanno automaticamente accesso ai socket creati dal processo padre (come per i file) System Call socket() Domain ■ Il parametro domain rappresenta il dominio di comunicazione che può essere: ● UNIX domain ● Internet domain ● Xerox Network System (XNS) ■ ■ Il dominio UNIX consente la comunicazione tra processi residenti sulla stessa macchina, mentre i restanti due vengono utilizzati per comunicazioni tramite rete. I valori da associare al parametro domain sono definiti nel file socket.h nel modo seguente: ● AF_UNIX (UNIX internal protocol) ● AF_INET (ARPA Internet protocols) ● AF_NS (Xerox Network System protocols) Nota: AF = Address Family System Call socket() TYPE ■ Il tipo definisce la semantica della comunicazione; sono disponibili i seguenti tipi principali i cui valori sono definiti nel file socket.h: ● SOCK_DGRAM ● SOCK_STREAM ● SOCK_RAW ● SOCK_SEQPACKET ■ Il tipo SOCK_DGRAM è basato sul protocollo udp ■ Non è garantita l’affidabilità ■ Il protocollo non è orientato alla connessione, per cui sono le stesse operazioni di input ed output che consentono l’indirizzamento corretto dei messaggi. System Call socket() ■ Il tipo SOCK_STREAM è basato sul protocollo TCP Un socket stream fornisce un modello di comunicazione orientato alla connessione con un flusso di byte non strutturato, ma per il quale è garantita l’affidabilità, la sequenza e la non duplicazione. ■ Adatto a problemi che richiedono un grosso scambio di informazioni tra corrispondenti stabili. ■ Un socket di tipo SOCK_RAW permette l’accesso ai meccanismi di più basso livello; può essere utilizzato quando si vuole costruire un protocollo particolare. ■ Un socket SOK_SEQPACKET ha le caratteristiche di un socket stream, ma in più garantisce il rispetto della struttura a messaggio della comunicazione; è utilizzato solo neldominio XNS. ■ System Call socket() protocol ■ Il parametro specifica il particolare protocollo che deve essere usato con i socket ■ Normalmente solo un singolo protocollo viene fornito ad ogni tipo di socket. ■ Se il parametro è messo a zero, viene selezionato il protocollo associato al tipo specificato. ■ Se si vuole specificare un protocollo come stringa ascii, si può richiamare la funzione getprotobyname() che, data una stringa che rappresenta un protocollo, fornisce il numero corrispondente. System Call socket() ■ L’associazione nome/identificatore di protocollo viene effettuata nel file /etc/protocols. struct protoent *getprotobyname(name) char *name; ■ Dove: struct protoent { char *p_name; char **p_aliases; int p_proto; }; /* nome del protocollo (es. TCP) */ /* nomi alternativi */ /* identificativo del protocollo */ System Call bind() ■ La System Call bind() associa all’identificativo del socket un ‘name’ che rappresenta il riferimento per il socket all’esterno del processo che lo ha creato. bind(s,name,namelen) int s; struct sockaddr_un *name; /* dominio Unix */ struct sockaddr_in *name; /* dominio Internet */ int namelen; s = identifica il socket name = identifica il nome che verrà assegnato al socket namelen = la dimensione di name pari alla dimensione di struct sockaddr System Call bind() name ■ Il nome del dominio di comunicazione ■ Nel caso il dominio UNIX, name è un puntatore ad una struttura di tipo struct sockaddr_un è definita nel file sys/un.h struct sockaddr_un { /* AF_UNIX */ short sun_family; char sun_path[108] }; ■ Il socket è rappresentato da un nome nel file system alla stessa stregua di un file, con l’unica differenza che il nome viene generato all’atto della bind. System Call bind() ■ Nel caso di dominio Internet il nome di un socket viene identificato da una struttura di tipo struct sockaddr_in (netinet/in.h) struct sockaddr_in { /* AF_inet */ short sin_family; short sin_port; struct in_addr sin_addr; char sun_zero[8]; }; AF_INET : dominio Internet sin_port : port number sin_addr : indirizzo Internet ■ L’indirizzo Internet è costituito da 4 byte che consentono di individuare la rete, e nell’ambito della rete, il calcolatore interessato. Internet Address address ■ L’indirizzo della macchina può essere espresso anche come una stringa. ■ La stringa può assumere una forma organizzata in sottodomini (domain name) che consente di individuare a livello mnemonico l’indirizzo geografico della macchina. ■ ■ Il legame (nome della macchina)/(indirizzo) è definito nel file /etc/hosts e/o nello spazio dei nomi gestiti dal DNS. La funzione gethostbyname() fornisce l’indirizzo Internet per un certo nome di macchina: struct hostent *gethostbyname(name) char *name; Internet Address ■ ■ La funzione restituisce un puntatore ad una struttura di tipo struct hostent struct hostent { char * h_name; /* official name of host */ /* alias list */ char **h_aliases; /* host address type */ int h_addrtype; int h_length; /* length of address */ char **h_addr_list; /* host IP address list */ }; define h_addr h_addr_list [0] /* usare come char *h_addr */ # La funzione restituisce la struttura sempre sulla stessa area di memoria, una successiva chiamata sovrascrive i vecchi valori, allora: struct hostent *server; struct in_addr server_addr; server = gethostbyname(host); bcopy(server->h_addr, &server_addr, server->h_length); Port Number ■ Alcuni ■ ■ valori per il port sono assegnati a servizi di rete eseguiti come superuser (1-1023) Identificativi maggiori di 1023 sono utilizzati dai processi eseguiti come utenti normali (il port 1024 è riservato) Poiché il port assume un valore intero è necessario tener presente un problema che è legato al trasferimento di interi su una rete. Nella rappresentazione dei numeri interi è possibile adottare due convenzioni: ● ● ■ MSBF : rappresentare prima (cioè all’indirizzo più basso) il byte più significativo (big endian) LSBF : rappresentare prima il byte meno significativo (little endian) Il problema viene risolto stabilendo un ordine convenzionale di rappresentazione;per la rete Internet si è scelta la convenzione MSBF. Port Number ■ ■ E’ necessario dunque che i processi applicativi in esecuzione sulle diverse macchine rispettino tale convenzione quando inviano o ricevono interi sulla rete. Vengono fornite delle macro che consentono di invertire l’ordine dei bytes; il loro nome è: ● ntohs() ● htons() ● ntohl() ● htonl() Nota: Le prime due trattano gli short mentre le ultime i long. ■ Se il numero intero viene ricevuto dalla rete è necessario usare le funzioni che iniziano con “n” (network to host), altrimenti le altre due che iniziano con “h” (host to network). ■ E’ necessario utilizzare le macro htons() per assegnare il valore al campo port della struttura struct sockaddr_in. Port Number ■ ■ Se il port è messo a zero nella chiamata alla bind(), il sistema assegna il primo valore libero. In questo modo è possibile conoscere il name associato ad un socket tramite la system call getsockname(). getsockname(s, name, namelen) int s; struct sockaddr_un *name; /* dominio UNIX */ struct sockaddr_in *name; /* dominio Internet */ int *namelen; ■ La system call restituisce nella struttura puntata da name il nome del socket e nel parametro namelen la sua lunghezza effettiva; quest’ultimo parametro va inizializzato con la lunghezza della struttura. Modello senza connessione scambio messaggi ■ Il modello si basa sul protocollo UDP ■ Per consentire la comunicazione tra i processi non è necessaria alcuna ulteriore operazione preliminare, è sufficiente utilizzare le operazioni di input/output. ■ Le operazioni di input vengono realizzate mediante: ● ● ● ■ read() recv() recvfrom() Le operazioni di output vengono realizzate mediante: ● sendto() System Call: recv() cc = recv(s, buf, buflen, flags) int cc; int s,buflen,flags; char *buf; ■ ■ La System Call recv() è identica a quella della read(), con la possibilità aggiuntiva di specificare dei flag per modificare il modo canonico delle operazioni di ricezione. Con il campo flags impostato a: ● ● MSG_PEEK : legge il messaggio senza consumerlo MSG_OOB : legge messaggi con alta priorità (out-of-band) ■ System Call: recvfrom() La recvfrom() rende possibile il colloquio bidirezionale in quanto permette di scoprire chi è il mittente del messaggio letto. cc = recvfrom(s, buf, buflen, flags, from, fromlen) int cc; int s,buflen,flags; char *buf; struct sockaddr_un *from; /* dominio UNIX */ struct sockaddr_in *from; /* dominio Internet */ int *fromlen from : punta ad una struttura che individua il mittente fromlen : contiene la sua lunghezza ■ Quando viene attivata la System Call è necessario inizializzare il parametro fromlen ■ con il valore della dimensione della struttura. Quest’ultima System Call è sicuramente la più adatta per applicativi che usano UDP. System Call: sendto() ■ Le operazioni di invio messaggi sono realizzate tramite la sendto() che consente di specificare il destinatario. cc = sendto(s, buf, buflen, flags, to, tolen) int cc; int s,buflen,flags; char *buf; struct sockaddr_un *to; /* dominio UNIX */ struct sockaddr_in *to; /* dominio Internet */ int tolen flags: ● MSG_OOB : specifica l’invio di un messaggio ad alta priorità (out-of-band) solo ● per socket-stream MSG_DONTROUTE: specifica l’invio senza routing to : socket destinatario tolen : contiene la lunghezza effettiva Comunicazione senza connessione recvform() read() AF_INET, addr, port AF_UNIX, “server” AF_UNIX, “client” in out recv() AF_INET, addr, port S out sendto() sendto() in C recvform() read() recv() Schema di comunicazione tra processi Esempio dominio Internet (udp) - server char hostname[40]; pp = getprotobyname(“udp”); s = socket(AF_INET, SOCKET_DGRAM, pp->p_proto); struct hostent *server, *gethostbyname() struct addr_in server_addr; gethostname(hostname,40); server = gethostbyname(hostname); bcopy(server->h_addr,(char *)&server_addr,server->h_length); struct sockaddr_in server_sock; server_sock.sin_family = AF_INET; server_sock.sin_addr = server_addr; server_sock.sin_port = htons(2005); bind(s,&server_sock,sizeof(server_sock)); recvfrom(s,buf, BUFLEN, 0, &client, &addrlen); sendto(s, msg, strlen(msg)+1, 0, &client, addrlen); SOCKET Preleva indirizzo Internet bind Riceve richiesta ed invia replica BIND ■ In alternativa rispetto all’esempio, dove si utilizza un indirizzo specifico della macchina locale, la bind può essere fatta senza indicare un indirizzo: server_sock.sin_addr.s_addr = htonl(INADDR_ANY); Esempio dominio Internet (udp) - client Richiama in maniera analoga socket() e bind(). argv[1]:il nome della macchina argv[2]:il port struct hostent *server, *gethostbyname() Preleva indirizzo Internet dalla macchina remota struct addr_in server_addr; server = gethostbyname(argv[1]); bcopy(server->h_addr,(char *)&server_addr,server->h_length); struct sockaddr_in server_sock; strcpy(command,”richiesta dal client”); sscanf(argv[2],”%d”,&port); server_sock.sin_family = AF_INET; Invia la richiesta al server server_sock.sin_addr = server_addr; server_sock.sin_port = htons(port); sendto(s,command,sizeof(command), 0, &server_sock,sizeof(server_sock)); Funzione getservbyname() ■ ■ E’ possibile associare in maniera stabile un numero di port au un certo servizio inserendo un entry nel file /etc/services . Il processo client può identificare il numero di port associato ad un certo servizio tramite la funzione getservbyname() . struct servent *ss, *getservbyname(); ss = getservbyname(“nome_serv”,”udp”); ■ Dopo tale chiamata il campo s_port contiene il numero di port assegnato al servizio. struct servent { char *s_name; /* official service name */ char **s_aliases; /* alias list */ int s_port; /* port # */ char *s_proto; /* protocol to use */ }; ■ ■ ■ ■ Modello con connessione instaurazione conn. È necessario introdurre ulteriori System Call per la fase di predisposizione della connessione. La System Call listen() predispone il processo ad accettare richieste di connessioni su un socket. listen(s, backlog) int s,backlog; s : individua il socket backlog : individua la dimensione della coda Il secondo parametro specifica il numero massimo di processi che possono essere in coda sulla richiesta di connessione. Quando il server è predisposto per accettare richieste di connessione lancia la System Call accept(). ■ ■ ■ System call : accept() La System Call accept() mette il processo in attesa di richieste di connessione sulla coda predisposta dalla listen(). ns = accept(s, addr, addrlen) int ns,s; struct sockaddr_in *addr; int *addrlen; s : identifica il socket su cui è stata fatta la listen() addr : identifica il nome del socket del client addrlen : la lunghezza del nome Quando una connessione viene accettata la richiesta viene rimossa dalla coda e la accept() restituisce il socket da utilizzare per comunicare con il processo client. ns = accept(s, 0, 0) In tale caso non viene restituito l’identificativo del corrispondente. System call : connect() ■ Il processo client, per richiedere una connessione, lancia la System call connect(). connect(s, name, namelen) int s; struct sockaddr_un *name; /* dominio UNIX */ struct sockaddr_in *name;/* dominio Internet */ int namelen; s : identifica il socket creato in precedenza. namelen : individua il server verso cui si chiede la connessione In genere il processo server una volta accettata una connessione, genera un figlio che gestisceil colloquio con il processo client mentre il server torna sulla accept() in attesa di nuove richieste di connessione. ■ Modello con connessione scambio messaggi Una volta stabilita la connessione il server (processo figlio) ed il client, colloquiano sui rispettivi socket tramite le System Call read() e recv() (input) e write() e send() (output). ■ La lettura e la scrittura sono orientate al byte ■ La send ha la stessa semantica della write(), ma in più consente di specificare il parametro flags . ■ cc = send(s, buf, buflen, flags) int cc; int s,buflen, flags; char *buf; Modello con connessione schema AF_INET, addr, port in S recv() fork() S1 send() recv() fork() S2 send() out connect() in out AF_INET, addr, port out in C1 recv() in out out in Schema di comunicazione tra processi send() send() C2 recv() Modello con connessione abbattimento connessione ■ Fase di disconnessione e rilascio transport-endpoint ■ La fase di disconnessione è rappresentata da una operazione di close() da parte dei corrispondenti. ■ ■ Il processo in lettura su un socket chiuso dal corrispondente riceve EOF (End Of File) Il processo in scrittura su un socket chiuso riceve un segnale (SIGPIPE), che se non gestito in maniera opportuna provoca la terminazione del processo. Esempio dominio Internet (TCP) server server_id = socket(AF_INET,SOCK_STREAM,0) SOCKET struct hostent *server, *gethostbyname(); struct addr_in server_addr; server = gethostbyname(hostname); bcopy(server->h_arrd,(char*)&server_addr,server->h_length); struct sockaddr_in server_sock; BIND server_sock.sin_family = AF_INET; server_sock.sin_addr = server_addr; server_sock.sin_port = 0; bind(server_id, &server_sock,sizeof(server_sock)); ■ Il numero di port viene assegnato dal sistema il server stampa il valore del port per renderlo noto ai processi client. Esempio dominio Internet (TCP) server listen(server_id,4) ■ Accetta connessioni con i client e genera processi figli che gestiscono la comunicazione con il client. while (1) { s1_id = accept(server_id,0,0); pid = fork(); if (pid== 0){ close(server_id); < comunicazione con il client….> close(s1_id); exit(0); } close(s1_id); } ■ Il processo padre genera il segnale SIGCLD per evitare il proliferare di processo zombie Esempio dominio Internet (TCP) client ■ client_id = socket(AF_INET,SOCK_STREAM,0) Richiede la connessione verso il server individuato dal port e dal nome della macchina remota ricevuti come parametri. struct hostent *server; Struct sockaddr_in server_sock; struct addr_in server_addr; server = gethostbyname(argv[1]); bcopy(server->h_addr,(char*)&server_addr,server->h_length); sscanf(argv[2],”%d”,&port); server_sock.sin_family = AF_INET; server_sock.sin_addr = server_addr; server_sock.sin_port = htons(port); connect(client_id, &server_sock, sizeof(server_sock)); Invia messaggio di richiesta send(client_id,command, strlen(command)+1,0) Comunicazione in ambito distribuito ■ Tipi di associazione A1 1:N N:M B1 A2 B2 A3 N:M Modello senza connessione ● C1 C2 A C2 ■ Associazione S 1:1 ■ Associazione ● /client-server Modello senza connessione ● Modello con connessione 1:N B Struttura di un’applicazione Associazione N:M/modello senza connessione A1 B1 socket() socket() bind() bind() sendto() recvfrom() recvfrom() sendto() close() close() Struttura di un’applicazione Associazione N:M/modello senza connessione Server socket() socket() bind() bind() sendto() fork() recvfrom() fork() Richiesta servizio socket() bind() Processo figlio sendto() Nuovo identificativo recvfrom() Parametri servizio recvfrom() sendto () servizio() sendto() close() replica recvfrom() close() Client Struttura di un’applicazione Client-server Modello con connessione Server socket() socket() bind() listen() accept() Richiesta connessione connect() fork() recv() Processo figlio Parametri servizio send() servizio() send() close() replica recv() close() Client