V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una...

76
I.T.S.T. INFORMATICA E TELECOMUNICAZIONI V ANNO TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI - Aspetti Evolutivi delle Reti - Internet, i Protocolli TCP/IP e le Tecnologie di Internet - Sistema Client/Server - Architetture di Rete - Intranet / Extranet - Crittografia - Linguaggi di Scripting Lato Client - Linguaggi Server Side PHP - Introduzione Al Linguaggio C++ - La Compilazione di un Programma C - Elementi Fondamentali del C - Controlli

Transcript of V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una...

Page 1: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

I.T.S.T. INFORMATICA E TELECOMUNICAZIONI

V ANNO

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI

- Aspetti Evolutivi delle Reti - Internet, i Protocolli TCP/IP e le Tecnologie di Internet - Sistema Client/Server - Architetture di Rete - Intranet / Extranet - Crittografia - Linguaggi di Scripting Lato Client - Linguaggi Server Side PHP - Introduzione Al Linguaggio C++ - La Compilazione di un Programma C - Elementi Fondamentali del C - Controlli

Page 2: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

ASPETTI EVOLUTIVI DELLE RETI

All’inizio della storia dell’informatica, i sistemi per l’elaborazione erano molto costosi e complessi e vi era la necessità di condividere tra più persone le poche risorse disponibili. Si affiancava al computer più potente, il mainframe, una serie di semplici terminali in grado di connettersi al computer centrale e sfruttarne le risorse. Successivamente, con la nascita e la diffusione dei personal computer, si è passati dal modello mainframe-terminal, in cui tutta la potenza di calcolo era concentrata in un unico operatore, alle moderne reti di computer, formate da un grande numero di elaboratori autonomi e interconnessi:

§ autonomi: significa che non devono esserci relazioni di dipendenza tra i vari sistemi; ogni computer, anche se disconnesso dalla rete, rimane funzionante;

§ interconnessi: significa che devono essere capaci di scambiare informazioni. Il mainframe affiancato da numerosi terminali viene quindi sostituito da un insieme di piccoli computer opportunamente interconnessi tra loro. Una rete di computer (o computer network) è un insieme di due o più computer in grado di trasmettere dati tra di loro. I servizi per gli utenti e per le aziende Il compito principale delle moderne reti è la condivisione di risorse. Le risorse possono essere hardware, file, dati, software, ecc. I vantaggi introdotti dalla condivisione sono molteplici. Pensiamo ad esempio ad una azienda che deve preparare i preventivi o gli ordini per i clienti. La connessione in rete presenta altri vantaggi per le aziende e utenti:

§ condivisione delle risorse: rendere disponibili in rete qualsiasi informazioni o programma;

§ migliore rapporto prestazioni/costo § estensione semplificata e graduale dei sistemi hardware: ogni sistema viene

configurato a seconda delle esigenze dell’azienda. È possibile aumentare le prestazioni del sistema, aumentando il numero o le dimensioni degli elaboratori (scalabilità);

§ maggiore affidabilità: il guasto di un PC non blocca il lavoro degli altri, come può succedere quando si blocca un mainframe. Se un computer non è in rete, in

Page 3: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

caso di guasto può provocare la perdita di tutto il lavoro. Occorre quindi al momento dell’installazione della rete, effettuare sempre copie di sicurezza (backup) dei dati importanti.

Client/server e peer to peer In generale, quando si parla di condivisione, vi è sempre un computer che mette a disposizione le risorse e un computer che le utilizza. Le reti in base alla condivisione, si suddividono in:

§ reti client/server: alcuni computer (server) mettono a disposizione risorse e offrono servizi, mentre altri (client) li utilizzano;

§ reti peer to peer: tutti i computer sono allo stesso livello e condividono risorse comuni; in questo tipo di rete, tutti i computer svolgono entrambi i ruoli di server e client

La distinzione tra client e server è netta: un client non può diventare un server o viceversa. In questo modello la comunicazione avviene tramite un messaggio a un server da parte di un client, che richiede l’esecuzione di un lavoro. Il server esegue il lavoro e restituisce la risposta. Quando il server e il client, stabiliscono una comunicazione, si hanno due possibilità:

§ esecuzione lato client: il programma viene trasmesso dal server, caricato nella memoria Ram del client ed eseguito sul client stesso;

§ esecuzione lato server: il programma viene eseguito sul server, che trasmette i risultati al client.

Un programma installato sul server e condiviso con altri computer ha dei vantaggi:

§ unica installazione: viene installato solo sul server; § aggiornamenti e manutenzione più semplici: devono essere eseguiti su una sola

macchina; § diminuzione dei costi: dovuti all’acquisto di licenze; § maggiore sicurezza dei dati: eseguire il backup solamente dei dati presenti sul

server.

Nelle reti peer to peer, non c’è una distinzione tra client e server: la rete è paritaria e tutti i computer si chiamano nodi. Questa tipologia di rete è utilizzata, nelle reti locali, dove ogni computer condivide i dati.

Page 4: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Con programmi specifici (eMule o bitTorrent) un computer si connette ad altri come client per scaricare un file; contemporaneamente si comporta da server e condivide i propri file con gli altri computer connessi in quel momento. Classificazione delle reti Reti locali LAN (Local Area Network) e WLAN (Wireless Local Area Network) Sono le reti più piccole e possono coprire un’area corrispondente alla dimensione di edificio. Queste reti consentono di condividere sistemi hardware, quali stampanti o scanner. Le ridotte dimensioni, consentono una notevole velocità nella trasmissione e ricezione dei dati. È possibile creare una rete locale utilizzando i cavi (LAN), oppure basandosi su collegamenti senza fili, cioè wireless (WLAN). L’unità di misura per la velocità di trasmissione è Mbps (Megabit al secondo). Una LAN ha una velocità che va da 10 a 10000 Mbps. Reti geografiche WAN (Wide Area Network) Le reti WAN hanno dimensioni geograficamente estese e possono arrivare a coprire un’intera nazione. Per realizzarla senza costi eccessivi, vengono utilizzate alcune infrastrutture già esistenti, come le linee telefoniche, però non essendo state progettate per tale scopo, la trasmissione non raggiunge un’alta velocità. Internet È la rete delle reti che copre il pianeta utilizzando infrastrutture di collegamento molto diverse: dalle dorsali transoceaniche, che permettono la trasmissione di grandi quantità di dati in poco tempo, alle linee telefoniche classiche, alle reti in fibra ottica. Tecniche di commutazione Il termine commutazione indica le operazioni con le quali il messaggio viene elaborato in modo che venga indirizzato verso il destinatario.

§ commutazione di circuito, di derivazione dal sistema telefonico, che crea un collegamento fisico;

§ commutazione di pacchetto, di derivazione informatica, che utilizza la tecnica dell’instradamento.

Page 5: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

La commutazione di circuito crea un vero collegamento fisico tra i due utenti e questo rimane stabile e riservato per tutta la durata della comunicazione. L’alternativa è rappresentata dalla commutazione di pacchetto. Ogni volta che si effettua una trasmissione, è necessario indicare alcuni dati aggiuntivi con cui si definisce il mittente e il destinatario. Si ha quindi l’operazione di imbustamento che, a partire dal messaggio originale, genera dei pacchetti. Un pacchetto è costituito da 2 parti fondamentali: la parte di intestazione (header) e quella di dati (payload). Esistono 2 tipi di nodi nella rete: intermedi e finali. I nodi intermedi svolgono la funzione di instradamento, cioè essi in base all’indirizzo del destinatario, decidono su quale canale deve essere instradato per farlo arrivare nel tempo più breve possibile. I nodi finali quando ricevono un pacchetto, esaminano l’indirizzo di destinazione; se questo coincide, il pacchetto viene copiato sul computer locale, altrimenti verrà ignorato. Mezzi trasmissivi e dispositivi di rete Nelle reti, l’unità di misura della velocità di trasmissione è il bit per secondo (indicato con bps o bit/s) e i suoi multipli (Kbps per migliaia, Mbps per milioni, Gbps per miliardi di bit per secondo). La caratteristica di un segnale è la frequenza che si misura in Hertz (Hz) e i suoi multipli (MHz e GHz). I mezzi trasmissivi più utilizzati sono:

§ Doppino telefonico: è un canale fisico, detto cavo Ethernet; § Fibra ottica § Wireless

Page 6: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

INTERNET, I PROTOCOLLI TCP/IP E LE TECNOLOGIE DI INTERNET

Internetworking (connessione di reti), o più semplicemente Internet, è un mezzo di comunicazione che opera in modalità multimediale (porta insieme segnali audio, video e dati) e che interconnette milioni di computer in tutto il mondo, utilizzando un linguaggio comune. È qualcosa di simile ad una rete WAN di computers, cioè un insieme di calcolatori connessi tra loro attraverso delle LAN a loro volta interconnesse ad altre con linea dedicata o attraverso collegamenti Modem-Server in modo da avvolgere tutto il mondo. Tutte le reti sono collegate da un insieme comune di protocolli tecnici che consentono agli utenti di ciascuna rete di comunicare o di utilizzare i servizi situati su una qualsiasi delle reti componenti. L'insieme comune di protocolli corrisponde al protocollo TCP/IP, il quale non rappresenta un singolo protocollo, ma in realtà corrisponde ad una suite di protocolli che prende il nome dai due più importanti tra essi: Transmission Control Protocol (TCP) e Internet Protocol (IP). L'obiettivo più importante raggiunto dal TCP/IP è l'interconnessioni tra reti estremamente eterogenee. Le varie reti appartenenti ad Internet possono essere infatti estremamente diverse tra di loro: per questo Internet è stata sviluppata in modo da essere indipendente dal tipo di computer e di rete locale che si vuole connettere. È possibile collegarsi con qualsiasi tipo di elaboratore, dal supercalcolatore al personal computer, ciascuno con un proprio sistema operativo diverso (MS-DOS, Unix, Linux, Windows, ecc.) e collegato con modalità differenti alla rete. Non esiste un "computer per Internet", sebbene le prestazioni ottenute dipendano dalle capacità del proprio calcolatore e dal mezzo fisico (linea, modem, ecc.) con cui avviene la comunicazione. Internet è quindi formata da diverse tipologie di reti:

• Dorsali (backbone) per interconnettere altre reti; • Connessioni di reti regionali; • Reti commerciali che forniscono l'accesso alle dorsali per gli abbonati del

servizio di connessione ad Internet; • Reti locali.

La storia di Internet Negli anni '60, di fronte al successo scientifico rappresentato dal primo Sputnik sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre dall'altra, a livello militare, predisposero un piano di difesa da un eventuale attacco atomico da parte

Page 7: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

dell'Urss, nell'ambito della cosiddetta Guerra Fredda. Fu così che il Pentagono creò ARPA (Advanced Research Projects Agency), un'agenzia per progetti scientifici a livello avanzato a scopi militari. Uno di questi progetti, presentato da Paul Baran nel 1962, mirava a creare un sistema di comunicazioni in grado di sopravvivere ad un attacco nucleare ed era basato sul sistema della trasmissione mediante commutazione di pacchetto (packet switching). Per raggiungere questo obiettivo era necessario che il sistema di comunicazione non avesse un punto centrale di controllo, colpire il quale avrebbe significato mettere fuori uso l'intero sistema, ma che avesse una struttura che garantisse le comunicazioni anche se parte dei collegamenti fossero stati distrutti. Bisognava che una comunicazione potesse seguire percorsi diversi in alternativa a quelli eventualmente distrutti. Nel 1969 Vinto Cerf creò ARPANET, collegando al nodo dell'Università di Los Angeles le tre Università americane di Santa Barbara (California), di Stanford e dell'Università dello Utah. Questo significo il passaggio dalle LAN ad una WAN fino all'attuale dimensione mondiale. ARPANET, dopo essere uscita dal controllo militare, ebbe come coordinatore la Nationa Science Foundation e prese il nome di NSFN, alla quale cominciarono a collegarsi reti regionali e locali, e successivamente internazionali (da allora prese il nome di Internet). Dal 1989 ebbe il suo maggiore sviluppo, grazie al World Wide Web progettato dallo staff del CERN di Ginevra. Ma solo nel 1993 Internet divenne davvero popolare grazie al primo browser, Mosaic. Nel 1994 venne rilasciato Netscape. Durante gli anni '90 gli utenti di Internet raddoppiarono ogni 6 mesi. Interconnessione di reti attraverso router Router: dispositivo che è in grado di prendere decisioni di instradamento che determinano il percorso dati più efficiente fra due segmenti di una rete di computer. Per connettere due reti WAN occorre un router il quale sarà connesso ad entrambe e sarà in grado di trasferire i dati da una rete all'altra. Si chiamano router poiché effettuano un'operazione di routing (instradamento), cioè sceglie il dispositivo intermedio (next-hop) a cui consegnare il pacchetto in modo che questo proceda verso la destinazione finale. Il forwarding, cioè l'inoltro vero e proprio del pacchetto verso il next-hop o la destinazione finale, è l'altra operazione fondamentale che deve essere svolta da un router. Gli indirizzi IP L'IP address è un indirizzo univoco che identifica un host sulla rete. Gli indirizzi IP identificano i computer host della rete e sono costituiti da una sequenza di 4 byte rappresentati in forma decimale. Questo vale per l'indirizzo IPv4 (IP versione 4). Un indirizzo IP è strutturato nel seguente modo:

Page 8: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

L'indirizzo di rete (network number) identifica la rete a cui un computer appartiene, l'indirizzo di host (host number) identifica il computer della rete: l'indirizzo IP non identifica un host in quanto tale, ma la connessione di un host alla relativa rete. Esistono tre indirizzi IP riservati per usi specifici:

• identifica la rete di default (default network). • 127.0.0.1, indirizzo di loopback, serve al computer per inviare messaggi a se

stesso (localhost); è utilizzato per identificare malfunzionamenti o per attività di testing.

• 255.255.255.255, detto indirizzo di broadcast, serve a inviare messaggi a tutti i computer della rete.

La suddivisione dell'indirizzo IP in quattro byte serve per classificare gli indirizzi IP e le reti associate ad essi. Sono utilizzati tre formati principali, detti classi: classe A, classe B e classe C. Inoltre ci sono altre due classi: classe D (che non ha indirizzi IP disponibili) e classe E (per usi futuri e scopi sperimentali). La classe di appartenenza è specificata dai primi bit dell'indirizzo. - Classe A: utilizzata per reti di grandi dimensioni, per esempio nelle grandi imprese internazionali. bit 0 = 0 Rete (7 bit) = 128 Network Indirizzo locale (24 bit) = 16 Mega Host Indirizzi IP in decimale: da 1.0.0.0 a 126.255.255.255 - Classe B: utilizzata per reti di medie dimensioni, per esempio la rete di un'università oppure per la rete di un'azienda con molti uffici. bit 0 = 1 bit 1 = 0 Rete (14 bit) = 16 K Network Indirizzo locale (16 bit) = 64 K Host Indirizzi IP in decimale: 128.0.0.0 a 191.255.255.255 - Classe C: utilizzata per reti di piccole e medie aziende. bit 0 = 1 bit 1 = 1 bit 2 = 0 Rete (21 bit) = 2 Mega Network Indirizzo locale (8 bit) = 256 Host Indirizzi IP in decimale: 192.0.0.0 a 223.255.255.255 - Classe D: per multicast address, cioè indirizzamenti di un sottoinsieme degli host di una rete. bit 0 = 1 bit 1 = 1 bit 2 = 1 bit 3 = 0 Gli indirizzi di classe D non sono indirizzi IP disponibili: potrebbero essere utilizzati da un router per fare un multicast su una sottorete.

Page 9: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

- Classe E: riservata per scopi sperimentali e per usi futuri. bit 0 = 1 bit 1 = 1 bit 2 = 1 bit 3 = 1 bit 4 = 0 Le sottoreti La tecnica di instradamento, basata sulla classificazione degli indirizzi per formato, non è funzionale, perchè molti indirizzi non saranno mai utilizzati. È possibile modificare la struttura dell'indirizzamento utilizzando le sottoreti (subnet). Il campo definito con indirizzo locale può essere suddiviso arbitrariamente in sottoreti e host. L'operazione di suddivisione di una rete in sottoreti si chiama segmentazione e può rendersi necessaria per vari motivi: per migliorare l'organizzazione della rete, per disporre di accessi diversi ai mezzi fisici di tipo Ethernet o FDDI, ma anche accesso a reti WAN. Esiste poi il problema della gestione del traffico della rete: in una rete di tipo Ethernet, tutti gli host del segmento fisico vedono, e analizzano, tutti i pacchetti trasmessi da tutti gli altri host di quel segmento. L'uso dei router consente di segmentare le reti per consentire un migliore rendimento generale, perché le reti IP segmentate minimizzano la quantità di traffico che ogni segmento deve gestire. La creazione delle sottoreti (subnetting) è ottenuta suddividendo la parte host dell'indirizzo IP in due parti: la parte di subnetting e la parte di host. IP address Per decidere in modo più veloce la destinazione dei pacchetti verso i computer della rete, si usano le subnet mask (maschera di sottorete), per indicare ai router della rete quali numeri dell'indirizzo IP devono essere controllati e quali no. La maschera di sottorete è un indirizzo di 32 bit che consente di dividere la parte host da quella di rete. La subnet mask è fondamentale per determinare se un indirizzo IP fa parte della rete locale o va ricercato in una rete remota. In presenza di reti locali non segmentate si utilizza la maschera di default. La maschera di sottorete è essenzialmente uno schema che specifica quali bit sono da controllare e quali no: la presenza di un bit 1 indica che la cifra è da controllare, il bit 0 indica che non serve controllare. In questo modo il router non deve controllare tutta la sequenza di 32 bit. Applicando una maschera di sottorete a un indirizzo IP si permette l'identificazione della sottorete d'appartenenza con la semplice comparazione dell'indirizzo e della maschera. L'operazione è un AND logico tra il numero IP e la sua maschera: il risultato di questa operazione è l'individuazione della rete di appartenenza. Lo stack TCP/IP di un host esegue, durante l'inizializzazione, un'operazione di AND fra il numero di IP e la sua maschera di sottorete. Quando un pacchetto viene inviato in rete, il suo destinatario IP viene sottoposto, anch'esso, a un AND logico con la subnet mask. Se le risultanti dei due processi sono uguali, significa che il destinatario appartiene alla rete locale: diversamente il pacchetto è inviato a un router che provvede a smistarlo in una rete

Page 10: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

remota. L'insieme del numero di rete e del numero di sottorete forma il numero di rete esteso. I bit 1 corrispondenti alle cifre del numero di rete esteso formano la subnet mask. La lunghezza in bit di questo numero (lunghezza del prefisso) è uguale al numero dei bit che compongono la sequenza dei bit da controllare nella subnet mask. Per questo motivo, ad esempio, per indicare che l'indirizzo IP: - 150.10.32.1 si utilizza la maschera di subnet - 255.255.255.192 che si può scrivere 150.10.32.1/26 cioè occorre controllare i primi 26 bit per determinare l'indirizzo di rete esteso. La notazione /lunghezza del prefisso è più compatta e più facile da leggere rispetto alla subnet mask. Usando questa notazione gli indirizzi di classe A, B, C, senza suddivisione in sottoreti si possono scrivere rispettivamente con il suffisso /8, /16, /24, per indicare la lunghezza del prefisso di rete nella subnet mask. I nomi di dominio Ogni sistema connesso alla rete è quindi identificato da un indirizzo numerico. Per ragioni di comodità si utilizza una codifica che prevede un nome invece di un indirizzo numerico, poiché gli indirizzi numerici sono più difficili da memorizzare: si possono usare indirizzi simbolici formati da sigle o parole di poche lettere. Gli indirizzi simbolici sono di solito individuati da sigle della forma: computer.sottorete.rete.zona (i caratteri sono scritti in minuscolo e senza spazi bianchi). La prima parte indica il nome del computer. La rimanente parte (sottorete.rete.zona), detta dominio, individua l'ente, l'azienda o l'organizzazione a cui il computer è collegato. L'ultima parte a destra è detta dominio di livello alto (o TDL, Top Level Domain) e può essere di due tipi: geografico od organizzativo. I domini geografici (country code) sono identificati da due caratteri che identificano la nazione (it = Italia, fr = Francia, uk = Regno Unito, ca = Canada, ecc.). I TDL di tipo organizzativo sono soprattutto gestiti negli Stati Uniti e identificano categorie di enti e aziende (ad esempio com, org, edu, net, info, biz). Questo sistema di gestione dei nomi di dominio si chiama DNS (Domain Name System): oltre a stabilire la corrispondenza tra indirizzo IP numerico e indirizzo simbolico (mappatura dell'indirizzo IP), esso usa un database di nomi simbolici distribuito sui vari server collegati a Internet in tutto il mondo. Nel linguaggio corrente dell'informatica risolvere un nome in un indirizzo IP significa ritrovare l'indirizzo che corrisponde al nome di un computer. Il DNS è un servizio fornito dal livello application del modello TCP/IP.

Page 11: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Il protocollo IP IP è un protocollo di livello Network non connesso, quindi senza conferma, che riceve i dati dal livello Transport e li incapsula in pacchetti di dimensione massima 64 Kb e successivamente li instrada. Quando arrivano a destinazione, la pila OSI viene percorsa dal livello fisico verso i livelli più alti: nel passaggio dei dati dal livello 2 al livello 3, il protocollo IP riassembla i frame in pacchetti e li consegna al livello di trasporto nell'ordine in cui sono arrivati. I campi che compongono la parte header del datagramma sono:

• Version: indica quale versione del protocollo IP è utilizzata per formattare il datagramma IP.

• HLEN: indica la lunghezza dell'intestazione (header length) di IP. • Service type: comunica al protocollo IP come occorre gestire il pacchetto IP. • Total length: contiene la lunghezza totale del pacchetto IP, cioè l'insieme dei dati

e dell'intestazione IP. • Packet fragmentation (Identification, Flags, Fragmentation offset): ricoprono un

ruolo nei processi di frammentazione e di riassemblaggio: • Identification: contiene un identificatore univoco che contrassegna il

datagramma originale. • Flags: di 3 bit, controlla la frammentazione. • Fragmentation offset: insieme al campo Identification serve a determinare come

ricomporre i pacchetti frammentati nel pacchetto originale. • Time to live (TTL): indica quanto a lungo un datagramma può esistere sulla rete. • Protocol: indica quale protocollo di alto livello è stato usato per creare le

informazioni immagazzinate nella porzione dei dati del pacchetto. • Header checksum: serve ad assicurare che le informazioni dell'intestazione non

si siano rovinate durante il transito. • Source IP address: contiene l'indirizzo IP a 32 bit dell'host mittente. • Destination IP address: contiene l'indirizzo IP a 32 bit dell'host destinatario. • Options: può essere formato da parecchi codici di lunghezza variabile. In un

pacchetto IP si può utilizzare più di una opzione: in questo caso i campi compaiono in sequenza nell'intestazione IP.

• Ciascuna opzione è lunga 8 bit ed è suddivisa in 3 sottocampi: • Il primo bit rappresenta il copy flag, che determina il modo in cui questa

operazione deve essere trattata quando un pacchetto origine è frammentato. • La option class è rappresentata da 2 bit e può assumere uno tra quattro valori: il

valore 0 significa che l'opzione ha a che fare con un controllo del datagramma o della rete, il valore 2 significa che l'opzione serve a scopo di debug o di misurazione, i valori 1 e 3 sono riservati per usi futuri e non sono ancora stati definiti.

Page 12: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

• I 5 bit finali rappresentano l'option number, che assume significato in base al valore della option class.

• Padding (riempimento): serve per arrotondare le dimensioni dell'header. Il protocollo ICMP Il protocollo ICMP (Internet Control Message Protocol) è un protocollo di livello Network che risulta essere poco noto. Quando un router o un host di destinazione devono informare l'host sorgente sugli errori nella trasmissione del datagramma viene utilizzato il protocollo ICMP. ICMP utilizza il protocollo IP per l'invio dei messaggi: infatti l'unità dati di ICMP viene incapsulata in un datagramma IP. ICMP è fatto per segnalare errori, non per garantire l'affidabilità al protocollo IP. Il campo codice può assumere diversi valori:

• Il codice 3 comunica all' host se una destinazione è irraggiungibile. • Il codice 4 è una forma primitiva di controllo di flusso, in cui un router segnala

a un host che non possiede memoria sufficiente per accodare i messaggi in arrivo, e quindi l'host di destinazione può avvalersi del messaggi di rallentamento della sorgente, se i datagrammi arrivano troppo rapidamente per essere elaborati.

• Il codice 11 crea un messaggio per segnalare il superamento del tempo di un datagramma.

• Il codice 13 si riferisce alla richiesta che venga specificato il tempo impiegato dal pacchetto per raggiungere la destinazione voluta.

• Il codice 17 richiede che venga specificata la maschera di sottorete utilizzata per quell'indirizzo.

I protocolli ARP e RARP Il protocollo ARP (Address Resolution Protocol) è un protocollo di livello 3 (Network) che consente di determinare l'indirizzo fisico MAC nei casi in cui risulti noto solo l'indirizzo IP. Quando un host deve spedire un pacchetto a un destinatario di cui non conosce l'indirizzo MAC, spedisce a tutti gli host della stessa rete fisica un messaggio in cui chiede quale sia l'host con quell'indirizzo IP. Nello stesso messaggio mette anche i propri indirizzi, sia quello fisico che quello IP: usa in sostanza una tecnica di broadcasting. L'host, il cui IP è quello cercato, rimanda al richiedente il proprio indirizzo fisico, permettendo così l'associazione tra i due. Il protocollo RARP (Reverse Address Resolution Protocol) funziona in modo analogo al protocollo ARP, ma procede nella direzione opposta: l'host richiedente spedisce un datagramma RARP in broadcast con il proprio indirizzo MAC e solo l'host che ha le tabelle di corrispondenza

Page 13: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

degli indirizzi risponde con un datagramma contenente oltre all'indirizzo MAC anche l'indirizzo IP del richiedente. Tecniche per l'instradamento dei pacchetti Gli host delle reti, chiamati anche end system non sono connessi direttamente tra loro, ma sono connessi attraverso nodi intermedi chiamati intermediate system (IS) e generalmente rappresentati da router che svolgono le funzioni di instradamento. Le principali tecniche utilizzate per l'instradamento dei pacchetti sulla rete sono:

• Routing by network address Un sistema è indirizzato scrivendo nel pacchetto il suo indirizzo. Ogni intermediate system attraversato usa questo indirizzo come chiave di ricerca nella sua tabella di instradamento e determina verso quale percorso inoltrare il pacchetto. Questa tecnica è utilizzata da protocolli non connessi, cioè senza conferma, come IP.

• Label swapping È generalmente utilizzato dai protocolli connessi. Ogni pacchetto è marcato con un'etichetta (label) che serve come chiave di ricerca nella tabella dell'intermediate system. Quando ritrasmette il pacchetto, l'intermediate system sostituisce l'etichetta con una nuova.

• Source routing È una tecnica utilizzata nei bridge delle reti Token Ring in cui la lista degli intermediate system da attraversare è scritta a priori dal nodo mittente nel pacchetto, in un apposito campo detto RI (Routing Information).

Page 14: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

SISTEMA CLIENT/SERVER In informatica il termine sistema client-server (letteralmente cliente-serviente) indica un'architettura di rete nella quale genericamente un computer client o terminale si connette ad un server per la fruizione di un certo servizio, quale ad esempio la condivisione di una certa risorsa hardware/software con altri client, appoggiandosi alla sottostante architettura protocollare. Più semplicemente, i sistemi client/server sono un'evoluzione dei sistemi basati sulla condivisione semplice delle risorse: la presenza di un server permette ad un certo numero di client di condividerne le risorse, lasciando che sia il server a gestire gli accessi alle risorse per evitare conflitti di utilizzazione tipici dei primi sistemi informatici. Le reti locali aziendali (LAN), la rete Internet, i sistemi informatici e i sistemi operativi sono organizzati sotto forma di una tipica architettura client-server per la fruizione dei rispettivi servizi. Client Il software client in genere è di limitata complessità, limitandosi normalmente ad operare come interfaccia verso il server. In generale nel campo informatico il termine client indica una componente che accede ai servizi o alle risorse di un'altra componente, detta server. In questo contesto si può quindi parlare di client riferendosi all'hardware o al software. Un computer collegato ad un server tramite rete locale o geografica, ed al quale richiede uno o più servizi, utilizzando uno o più protocolli di rete è un esempio di client hardware. Un programma di posta elettronica è un esempio di client software. Sono sempre di più i software, come il web, l'e-mail, i database, che sono divisi in una parte client (residente ed in esecuzione sul pc client) ed una parte server (residente ed in esecuzione sul server). Il termine client indica anche il software usato sul computer client per accedere alle funzionalità offerte dal server. Ad esempio, nel web il software client è il web browser, e parla con un server web attraverso il protocollo HTTP; per l'e-mail il client è detto in gergo mail user agent o MUA (ad esempio, Outlook, Mozilla Thunderbird, Eudora ), e parla con il server (Mail Transfer Agent o MTA) attraverso i protocollo SMTP e POP o IMAP; il client per la consultazione o la modifica del database (spesso costituito da

Page 15: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

librerie software utilizzate da un'applicazione) parla con il DBMS, che gestisce il database e risponde alle interrogazioni del client. Server Il software server, oltre alla gestione logica del sistema, deve implementare tutte le tecniche di gestione degli accessi, allocazione e rilascio delle risorse, condivisione e sicurezza dei dati o delle risorse. Ad esempio un server di posta elettronica è paragonabile ad un qualunque ufficio postale. Gli utilizzatori per accedere via client alla loro cassetta di posta elettronica devono essere stati autorizzati. In modo analogo un utente deve possedere la chiave della cassetta sita presso un ufficio postale dalla quale vuole prelevare la corrispondenza. Interazioni client/server Quando un computer client si connette direttamente ad un sistema di database o a una server application standard, questa viene chiamata 2-tier architecture (architettura a 2 livelli). Recentemente, è più usuale per computer client, chiamati thin client che non incorporano business logic, ma solo elementi di interfaccia, connettersi ad una server application che implementa una business logic nella quale transitivamente (ossia successivamente) comunica con il database del server, il quale memorizza i dati utilizzati dall'applicazione. Tale architettura è chiamata 3-tier architecture (architettura a 3 livelli). In generale architetture ad n livelli possono impiegare un certo numero di servizi distinti, comprese relazioni transitive tra application server che implementano differenti funzioni di business logic, ognuna delle quali può impiegare o meno un sistema di database condiviso o distinto. Collegamento I client ed il server sono in collegamento tramite un protocollo di comunicazione attraverso una rete di comunicazione. Il protocollo può essere in chiaro o in certi casi crittografato. Nell'ambito delle telecomunicazioni, due o più macchine o host (computer, telefono, stampante, ecc.) possono comunicare tra loro rispettando norme che sono dette

Page 16: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

protocolli di rete. L'aderenza ai protocolli garantisce che due macchine possano comunicare correttamente, anche se sono state realizzate indipendentemente. Servizio con e senza connessione Quando un client e un server iniziano a comunicare si possono scambiare pacchetti di controllo prima di spedire i dati effettivi/reali (comunicazione orientata alla connessione). Queste procedure, dette di handshaking, preparano le due componenti alla comunicazione. Tali procedure sono alla base, ad esempio, del TCP. Tuttavia possono anche esserci servizi che inviano direttamente i dati senza connessione e riscontri come nel caso dell'UDP. La maggior parte delle applicazioni, tuttavia, ha bisogno di inviare i dati in maniera sicura e affidabile per cui l'handshake serve proprio a questo compito. Si comprende dunque come la connessione attraverso TCP, ad esempio, sia più sicura, ma anche più lenta perché scambia non solo dati reali, ma anche dati di servizio. Livello di servizio: code Quando troppi client accedono ad un servizio, può succedere che la coda di attesa diventi inaccettabile. In questo caso si parla di sovraffollamento. Il gestore deve prendere delle misure per cadenzare le richieste o per aumentare le risorse disponibili. Il calcolo dei tempi di attesa e dei livelli di servizio è oggetto di studi matematici e modellizzazioni informatiche, come la teoria delle code. La coda di richieste generati dai clienti può essere gonfiata artificialmente allo scopo di negare il servizio ai clienti che autenticamente lo richiedono. Questo succede nel caso di un attacco informatico di tipo Denial of Service (DOS) o Distributed Denial of Service (DDOS). In questi attacchi, il nemico crea, assolda o manipola in maniera irregolare un alto numero di client, a cui comanda una cadenza di richieste molto superiore a quello previsto dal servizio sotto attacco. Esempi di sistemi client/server:

• Web server: per la gestione dell'interazione via web tra server e client. • File server: per la condivisione dei file; • FTP server: per la gestione dell'upload/download dei file; • Database server: per la gestione di grandi moli di dati; • Groupware: per la gestione d'informazioni riguardanti gruppi di lavoro; • Print server: per la condivisione delle stampanti;

Page 17: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Implementazioni Architettura di rete a livelli Ciascun protocollo regola normalmente solo una parte degli aspetti di una comunicazione. I diversi protocolli sono organizzati con un sistema o architettura di rete detto "a livelli" dove in ciascun livello viene usato uno specifico protocollo. La divisione in livelli è fatta in modo che ciascun livello utilizzi i servizi offerti dal livello inferiore, e fornisca servizi più "ricchi" al livello superiore. I diversi livelli in un host comunicano tra loro tramite le interfacce. Ogni livello parla solo con quello immediatamente superiore e con quello immediatamente inferiore. I protocolli regolano invece la comunicazione tra due entità dello stesso livello, che serve a fornire servizi al livello superiore. I vari livelli sono organizzati in pile di protocolli (stack protocollare). Le pile di protocolli sono un modo flessibile per combinare componenti per realizzare un servizio. Un esempio reale di una organizzazione a livelli protocollari, classico nelle trattazioni inerenti alle reti di calcolatori, è quello del percorso di una valigia in un viaggio aereo partendo dalla casa di origine all'hotel di destinazione. Il primo livello che notiamo è quello della preparazione della valigia: il turista prende i vestiti e ve li ripone per poi chiuderla, come ciò viene fatto è definito dal protocollo del primo livello 1º. Il livello 2º è quello dell'addetta alla valigie all'aeroporto di partenza, il turista gli consegna la valigia (passaggio dal primo al secondo livello) e l'addetta attacca alla valigia le informazioni relative al volo e alla destinazione. Qui notiamo l'aspetto fondamentale dell'organizzazione a livelli protocollari, cioè che per l'addetta non è necessario conoscere come i vestiti sono stati riposti nella valigia, altresì non è necessario per il turista conoscere le operazioni che deve effettuare l'addetta, infatti il turista otterrà quello che vuole (avere i vestiti all'hotel d'arrivo) senza che ciò influisca affatto come gli altri protocolli debbano lavorare, a patto che lo facciano correttamente. La struttura serve ad adempiere ad alcuni compiti:

• controllo di errore; • controllo di flusso; • frammentazione e riassemblaggio; • multiplexing, in modo che sessioni dello strato più alto possano condividere una

singola connessione dello strato più basso; • instaurazione della connessione.

Page 18: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Tale architettura presenta vantaggi concettuali e strutturali anche se alcuni si sono opposti in maniera decisa in quanto uno strato spesso duplica le funzionalità di un altro strato in maniera ripetitiva. Ad esempio, il servizio di ADSL viene fornito con diverse modalità, le più comuni sono chiamate PPP over ATM (ovvero il protocollo Point to Point usa i servizi forniti dal protocollo ATM) e PPP over Ethernet. Il livello più basso è detto "livello fisico" e si occupa di gestire la trasmissione dei segnali attraverso il mezzo trasmissivo (cavo, fibra ottica, infrarossi, ecc.). Il livello più elevato è chiamato "livello applicativo" ed è quello che permette all'utente di creare il messaggio da comunicare. La divisione in livelli è piuttosto rigida a livello di specifica dei protocolli, mentre nell'implementazione spesso diversi livelli vengono implementati insieme in uno stesso modulo software. Non è detto che due macchine che comunicano usino la stessa pila di protocolli. Ad esempio, se vi connettete ad Internet attraverso un modem voi appoggiate il livello di rete IP su una connessione PPP, mentre il server a cui vi collegate probabilmente appoggia la rete IP su una connessione Ethernet. In una rete a pacchetto ciascun livello della "pila protocollare" aggiunge ai pacchetti una intestazione, attraverso una operazione detta imbustamento. Il termine si applica anche ad alcune reti a commutazione di circuito, come SDH, dove l'imbustamento è un circuito dedicato a trasmettere informazioni di controllo. Modello OSI e Modello TCP/IP L'International Organisation for Standardisation (ISO) nel 1979 ha rettificato lo standard Open Systems Interconnection (OSI), con l'intenzione di creare un modello di riferimento per le telecomunicazioni da usare nelle reti di tutto il mondo. All'atto pratico però, lo standard de facto che viene comunemente usato nella maggior parte delle reti, è il TCP/IP, definito nella RFC 1155 da parte dell'IETF. Le differenze fondamentali tra i due standard sono semplici: il primo è stato definito a tavolino da un'organizzazione super partes, mentre il secondo è opera di chi costruì materialmente le prime reti, sviluppandolo sul campo. Inoltre, lo standard ISO/OSI assegna un determinato compito ad ogni livello, mentre il TCP/IP è più "elastico" e permette di sviluppare protocolli che svolgono più di un compito-base. Elenco di protocolli di rete secondo ISO/OSI. Nella seguente suddivisione, si segue lo standard ISO/OSI.

Page 19: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

- Livello 1: fisico

• Bluetooth • DSL Digital Subscriber Line • FDDI • RS-232 • Wi-Fi • Ultra Wide Band (UWB)

- Livello 2: link

• Ethernet • Point-to-Point Protocol (PPP) • Token ring • ATM Asynchronous Transfer Mode

- Livello 3: rete

• IP Internet Protocol • X.25 • IPX

- Livello 4: trasporto

• TCP e UDP (usati su IP) • SPX (usato su IPX) • NetBIOS

- Livello 5: sessione - Livello 6: presentazione - Livello 7: applicazione - Protocolli di servizio:

• Dynamic Host Configuration Protocol - (DHCP) • Domain Name System - (DNS) • Finger protocol • Network Time Protocol - (NTP) • Simple Network Management Protocol - (SNMP) • Lightweight Directory Access Protocol - (LDAP)

Page 20: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

- Protocolli di accesso a terminali remoti:

• Telnet • Secure Shell - (SSH)

- Protocolli usati per realizzare il servizio di posta elettronica e newsgroup:

• Simple Mail Transfer Protocol (SMTP) • Post Office Protocol (POP) • Internet Message Access Protocol (IMAP) • Network News Transfer Protocol (NNTP)

- Protocolli di trasferimento file:

• File Transfer Protocol - (FTP) • Hypertext Transfer Protocol - (HTTP) • Internet Relay Chat - (IRC) • Gnutella

I livelli visti precedentemente sono una suddivisione concettuale, ma la loro implementazione non è uniforme; infatti il livello fisico e quello di collegamento di solito sono presenti sulla scheda di interfaccia della rete, mentre il livello di rete ha un'implementazione mista hardware-software. Client-server in un sistema locale Quasi tutti i sistemi operativi utilizzano, per il funzionamento dei vari processi, dei meccanismi basati sul modello client-server. Lo stesso kernel si comporta come server quando gestisce le chiamate alle primitive di sistema da parte dei processi in esecuzione. Più in generale in un sistema operativo, per alcuni tipi di servizi, sono espressamente previsti dei processi server, gli unici in grado di eseguire una certa operazione. Spesso questi processi hanno accesso esclusivo ad una risorsa e devono, appunto, servire le richieste dei processi client. Ad esempio, nei sistemi Windows è presente uno spooler, unico processo in tutto il sistema a poter utilizzare la stampante. Per poter stampare, un processo non deve interfacciarsi con il driver della stampante (ed eseguire la sequenza del driver virtualizzato acquisizione-uso-rilascio) ma deve inviare i propri dati, attraverso i servizi offerti dal sistema, al processo spooler, il quale, tra l'altro, effettua lo scheduling dei documenti da stampare. Una volta inviati i dati allo spooler, il processo saprà non che la stampa è stata eseguita, ma che lo sarà certamente (a meno di intoppi). Avendo accesso esclusivo a tutte le stampanti di sistema, il driver della stampante non prevede procedure di acquisizione e rilascio.

Page 21: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

ARCHITETTURE DI RETE Le architetture di rete definiscono protocolli, formati dei messaggi, standard per macchine e pacchetti software; gli obbiettivi che si prepongono i loro implementatori sono:

• connettività di hardware e software anche eterogenei per formare un collegamento unificato di rete.

• utilizzo di blocchi semplici di produzione seriale. • facilità e flessibilità d’implementazione. • trasparenza e quindi facilità d’uso dei servizi forniti agli utenti. • gestione di strumenti di rilevazione e correzione di errori. • facilità di modifica ed evoluzione parallelamente all’evoluzione di richieste

degli utenti e tecnologie.

Esempi di architetture di rete sono:

• SNA ( System Network Architecture ): utilizzata nei sistemi IBM. • DECNET: della Digital ( VAX, PDP ). • TCP/IP: standard di fatto, la più utilizzata (Internet). • OSI: è lo standard imposto dagli organizzatori di standardizzazione, ma fatica

ad imporsi. Livelli Altra caratteristica comune alle diverse architetture è l’approccio multistrato: si dividono le funzioni da svolgere nella rete in gruppi, ognuno viene poi assegnato a vari strati funzionali (livelli) che dovranno anche fornire specifici servizi. Le reti sono nate come soluzioni proprietarie (ogni ditta realizzava una sua rete); gli enti di standardizzazione sono nati in un secondo tempo, quindi non tutte le reti hanno uno stesso standard, presentando numero, nomi e contenuti diversi di livelli. Si parte dal primo livello vicino all’hardware e si arriva al più alto (applicazione) vicino all’uomo. Tutti i livelli, tranne il fisico, stabiliscono collegamenti logici, astrazioni, utilizzando linguaggi propri; ogni livello realizza quindi un collegamento: verticale (verso superiori ed inferiori), attraverso un’interfaccia, che definisce quali operazioni primitive e servizi sono forniti da un livello ai livelli superiori (mascherando come), utilizzando un certo formato di dati; orizzontale (verso il pari livello nella rete comunicante) utilizzando il relativo protocollo di livello che definisce regole di conversazione fra livelli paritari; ogni messaggio viene costruito da ogni livello come se fosse diretto al livello corrispondente nel nodo destinatario, astraendo così dalla struttura fisica dei dispositivi.

Page 22: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

L’informazione in realtà, per essere comunicata, fluisce da uno strato al successivo fino a raggiungere lo strato finale cui è destinata. Per esempio, per la comunicazione tra due utenti, il trasferimento di una informazione richiede l’attraversamento di tutti gli strati nelle due direzioni (dallo strato applicazione allo strato fisico in fase di trasmissione e dal fisico all’applicazione in fase di ricezione). Gli strati non devono essere utilizzati necessariamente tutti in un processo di comunicazione; possono essere utilizzati solo alcuni di questi, ovviamente contigui tra loro, in funzione della natura del sistema di comunicazione. Un’architettura può essere quindi definita in termini di: servizi forniti da ciascun strato, interfacce e formati di dati utilizzati. Due i vantaggi principali della stratificazione: possibilità di modifica di un livello indipendentemente dagli altri, mantenendo però l’interfaccia col sovrastante; possibilità di comunicazione fra due nodi di rete aventi diverso hardware e software, purché adottino gli stessi protocolli e gli stessi formati di dati. Il modello di riferimento iso/osi Il modello di interconnessione di sistemi a sette livelli OSI (Open System Interconnection), per reti di calcolatori, è stato definito dall’ISO per fornire un riferimento a tutti i protocolli di trasmissione multistrato. Il modello Osi non è, di per sé, una vera e propria architettura, infatti non specifica approfonditamente servizi e dettagli tecnici che devono essere garantiti ad ogni livello, ma si limita a definire e descrivere ciò che deve essere compiuto a ogni livello. 7. Applicazione 6. Presentazione 5. Sessione 4. Trasporto 3. Rete 2. Data link 1. Fisico I principi seguiti per realizzare il protocollo OSI sono:

• uno strato per ogni differente livello di astrazione. • una funzione ben definita per ogni strato. • funzioni degli strati dettate dagli standard internazionali (ISO). • minimizzazione del flusso dei dati fra le interfacce.

Page 23: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

• un numero di strati sufficiente a non raggruppare funzioni distinte nel medesimo strato, se non in caso di necessità, ma abbastanza ridotto per non appesantire eccessivamente l’architettura.

I dati vengono trasferiti tra i vari livelli secondo una tecnica di imbustamento multiplo. LIVELLO 1: FISICO Si preoccupa di trasmettere sequenze binarie sul canale di comunicazione, verificando la disponibilità del destinatario al colloquio e alla ricezione dei dati (handshaking). Specifica modalità di attivazione e disattivazione, tensioni corrispondenti ai valori 1 e 0, caratteristiche dei cavi (tipi, dimensioni, in-pendenze...), la funzione dei piedini dei connettori di rete. La sua gestione richiede quindi ingegneri elettrici. LIVELLO 2: DATA LINK Organizza i dati in strutture di bit (frame) da passare al livello di rete, inserendo in esse sequenze di bit di controllo per garantirne la correttezza. Regola i tempi di comunicazione ovviando eventuali differenze di velocità. LIVELLO 3: RETE Il livello 2 gestisce un solo canale di trasmissione , cioè gestisce solo la trasmissione fra un calcolatore e uno a lui direttamente collegato (punto-punto). Per far parlare calcolatori non direttamente collegati occorre un protocollo di livello più alto, quello classico è il livello 3. Tale livello gestisce l’instradamento dei messaggi, determinando quali sistemi intermedi devono essere attraversati da un messaggio per giungere a destinazione, utilizzando e gestendo per questo tabelle di instradamento, così da ottimizzare il traffico sulla rete; le tabelle tengono conto quindi del traffico, ma anche dell’architettura di rete, quindi della topologia. Il livello di rete risolve infine i problemi di interconnessione di ambienti di rete distinti(internetworking). LIVELLO 4: TRASPORTO Fornisce servizi affidabili per il trasporto dei dati end to end (indipendenti dalla rete sottostante), in modo trasparente agli utenti. Frammenta i pacchetti in modo che abbiano dimensioni idonee al livello tre. Controlla il flusso (la velocità di trasmissione, per evitare congestioni). Stabilisce e scioglie le connessioni che definiscono il percorso di rete. Il livello 4 realizza una rete come se un calcolatore fosse collegato in modo adiacente a tutti gli altri.

Page 24: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

LIVELLO 5: SESSIONE E’ responsabile della tipologia (unidirezionale, bidirezionale contemporaneo o meno) del dialogo, della sincronizzazione tra due programmi applicativi (gestione interruzioni, identificazione interlocutore...) e del conseguente scarico dei dati. Lo scopo è quello di rendere assolutamente trasparente il processo di comunicazione per gli strati superiori (sei e sette). LIVELLO 6: PRESENTAZIONE Riconosce segnali di controllo, metodi di conversione dei dati dal formato originale (trasmittente) a quello standard della rete. Interpreta dati in forma crittografata e decomprime i dati. Permette quindi il dialogo fra macchine eterogenee che hanno una diversa codificazione dell’informazione, mentre la reale gestione della trasmissione nella rete è a carico dei livelli inferiori. LIVELLO 7: APPLICAZIONE E’ il livello che si interfaccia direttamente con i programmi applicativi, cioè appartenenti al sistema operativo o scritti dagli utenti e attraverso i quali l’utente finale utilizza la rete. Garantisce che i dati in arrivo vengano organizzati a seconda delle caratteristiche del dispositivo ricevente, ad esempio un terminale (sequenze di escape, posizione cursore...), utilizzando per far questo una procedura software che definisce una corrispondenza fra tutti i tipi di terminali presenti nella rete, di modo che il dialogo risulti sempre comprensibile all’utente. Gestisce una serie di servizi diretti all’utente facilitandogli l’utilizzo di risorse e informazioni di rete. Topologie di rete Le topologie definiscono le connessioni fisiche degli elementi che compongono la rete, secondo necessità reali come:

• economicità (es. : costo connessione nodi e comunicazione messaggio). • intensità del traffico. • morfologia geografica e architettura dell’ambiente. • sicurezza o resistenza ai guasti.

Topologia a stella C’è un nodo centrale al quale sono direttamente connessi tutti gli altri. Il basso costo è garantito da singole linee di collegamento e dal passaggio del solo nodo centrale per comunicare. Per limitare il "collo di bottiglia" spesso il nodo centrale si dedica

Page 25: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

solamente a smistare le informazioni. Con questa topologia abbiamo un basso livello di sicurezza in quanto un guasto sulla linea isola il nodo collegato ad essa; un guasto al nodo centrale comporta il blocco totale della rete. Tale topologia non va inoltre confusa con il sistema centralizzato perché ogni nodo gestisce le risorse e il nodo centrale si dedica solo allo smistamento. Topologia a stelle connesse Più stelle vengono connesse tra loro tramite nodi centrali , evitando il pericolo di totale caduta della rete e mantenendo bassi i costi. Topologia gerarchica Questa rete presenta un’organizzazione ad albero dei nodi: ogni nodo, tranne la radice, è figlio di un padre e avrà eventualmente nodi fratelli e figli a sua volta. L’architettura è significativa in ambienti aziendali o pubblici con forti elaborazioni locali e controlli gerarchici. Veloci sono i collegamenti diretti (figli e padre), lenti quelli su lunghe distanze con affollamento crescente all’avvicinarsi al nodo radice. La struttura è equivalente a quella a stelle connesse (i nodi padri radici, i figli centri delle stelle connesse). Topologia completamente connessa Ogni nodo è connesso direttamente a tutti gli altri; ciò implica alti costi iniziali (aumento quadratico n° connessioni ad ogni nuovo nodo), ma anche alta velocità garantita dal collegamento diretto, e alta sicurezza: l’interruzione di una linea rallenta semplicemente la rete. Topologia parzialmente connessa Alcuni collegamenti, almeno uno per ogni nodo, in base alle necessità reali di comunicazione, limitando i costi e garantendo elevate prestazioni ed affidabilità. Topologia ad anello Ogni nodo è collegato ad altri due, costituendo una struttura circolare. Monodirezionale ha bassi costi iniziali, discreti per il collegamento, equità e quindi non concentramento fra i nodi, mentre un guasto ad una linea isola il nodo prossimo ad essa, e comunque riduce la comunicazione.

Page 26: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Bidirezionale permette risparmio di tempo in trasmissione ( con n nodi il numero medio di nodi attraversati diventa n/2 ), elimina il pericolo di totale isolamento per singola linea; si può scegliere fra due percorsi possibili, valutando numero di nodi da attraversare, intensità del traffico, velocità di trasmissione lungo canali di diversa natura fisica; la gestione della scelta implica un aumento di complessità software, compensata dall’incremento delle prestazioni. Topologia a bus Tutti i nodi sono collegati ad un unico canale di comunicazione condiviso, in cui porre i messaggi dal bus stesso instradati e sincronizzati per evitare ingorghi. Il bus circolare permette, a dispetto del lineare, due percorsi possibili, velocizzando quindi la comunicazione. Ogni messaggio viaggia dal bus alla destinazione senza attraversare altri nodi. Il controllo semplificato del bus comune garantisce quindi la sicurezza. Mezzi trasmissivi Doppino telefonico

Costituito da una coppia di fili di rame isolati, intrecciati (per ridurre l’interferenza elettrica fra essi), dello spessore di circa 1 mm. Utilizzato in trasmissioni sia analogiche che digitali, con larghezza di banda dipendente da sezione del filo e distanza da attraversare (R= r L/S); per distanze elevate si usano ripetitori in modo da rigenerare il segnale. Cavo coassiale

Page 27: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Composto da un nucleo di rame, circondato da materiale isolante, con ulteriore involucro costituito da un conduttore intrecciato. La struttura permette alta larghezza di banda e resistenza al rumore: per cavi da 1 Km si raggiunge una velocità trasmissiva di 1 Mbps, mentre per velocità più elevate si richiedono cavi più corti. Viene largamente impiegato nelle reti locali e nel sistema telefonico, anche se attualmente il doppino ha fatto notevoli progressi come velocità (si riescono a raggiungere per distanze limitate, anche 100Mb/s), presentando inoltre un minor costo in tempo e in denaro per l’installazione rispetto al cavo coassiale. Fibra ottica Composta da un minuscolo e flessibile filo di materiale vetroso formato da due strati concentrici; quello interno (nucleo), presenta un indice di rifrazione maggiore di quello esterno (mantello), così che la luce iniettata in esso viene mantenuta all’interno del mantello ("specchio") e si propaga (legge di Snell); vi è un’ulteriore protezione tramite un rivestimento primario e una guaina esterna, questa usata anche per rendere palpabile la fibra ( @ 1mm). La luce è composta da fotoni, particelle neutre non soggette come gli elettroni, a disturbi elettromagnetici, e quindi permette una banda maggiore, con bassa perdita di potenza, e di conseguenza una maggior velocità trasmissiva (attualmente @ 2,5 Gbit/s, cioè 2,5*10^9 bit/s); il raggio luminoso (costituente il segnale informazione) è contenuto nel campo dell’infrarosso ed è ottenuto da un diodo laser che emette una luce "monocromatica" (una frequenza) e "coerente" (una fase) quando attraversato da corrente; il rilevatore è un fotodiodo pin, che emette un impulso elettrico quando viene attraversato da radiazione luminosa. Etere (satellite) Non richiedendo cavi o fibre, diventa un utile ed economicissimo canale trasmissivo, per raggi infrarossi, onde radio o segnali radio. I satelliti di comunicazione (geostazionari) contengono trasponditori che recepiscono segnali da una porzione di spettro, li amplificano e li rispediscono su un’altra frequenza per evitare interferenze; accordi internazionali assegnano posti orbitali e frequenze per regolare il traffico. Il costo di trasmissione è indipendente dalla distanza e non vi sono barriere naturali o architettoniche.

Page 28: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

INTRANET / EXTRANET

In informatica e telecomunicazioni l'intranet è una rete aziendale privata che utilizza il protocollo TCP/IP, ma può estendersi anche con collegamenti WAN e VPN. Spesso tale rete o è completamente isolata dalla Rete Internet esterna (es. LAN), rimanendo a solo uso interno, oppure comunica eventualmente con la rete esterna e le altre reti, attraverso opportuni sistemi di comunicazione e relativa protezione(come ad esempio un firewall). A volte il termine è riferito, a livello logico e non infrastrutturale, solo alla rete di servizi più visibile, il sistema di siti che formano uno spazio web interno (ad esempio a un'azienda o ad una organizzazione). In altre eccezioni il termine può essere inteso come il sistema di informazioni e servizi di utilità generale accessibili dalla rete interna. Quando una parte della intranet viene resa accessibile a clienti, partner o altre persone esterne all'organizzazione, tale parte diventa una extranet. Se a livello tecnologico l'intranet può essere definita come la rete informatica interna basata sul protocollo TCP/IP, negli ultimi anni il concetto ha assunto una forma diversa, oltrepassando gli aspetti tecnologici per impattare fortemente sull'organizzazione dell'impresa. Modelli di Intranet Attualmente la concezione più comune di intranet prevede un Corporate Portal come punto di ingresso ad applicazioni specifiche, quali:

• Publishing: pubblicazione, personalizzazione e visualizzazione dei contenuti sull'intranet, realizzando la comunicazione monodirezionale di contenuti verso il personale.

• Document management: supporto all'acquisizione ed alla gestione della conoscenza esplicita, con funzioni di archiviazione, indicizzazione, correlazione e ricerca;

• Community: supporti alla comunicazione e all'interazione tra utenti attraverso servizi interattivi (forum, mailing list, instant messaging, chat etc), finalizzati alla gestione della conoscenza implicita all'interno dell'azienda;

• Collaborative work: supporto alla collaborazione e al teamworking (ad esempio groupware, e-room, videoconferenze etc);

• Legacy integration: supporto all'accesso ai sistemi informativi aziendali, ai dati e alle procedure dei sistemi gestionali e di tutti gli altri applicativi in azienda;

• Self Service: funzionalità in grado di erogare servizi interattivi ai dipendenti, come e-learning, rubrica del personale, modulistica, help desk informatico etc.

Page 29: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Le modalità di impiego, utilizzo e gestione di queste funzionalità possono essere estremamente diverse per ogni azienda. Tanto che sotto il termine 'intranet' ricadono applicazioni difformi per obiettivi, funzionalità, attività supportate, tecnologie usate e legami con gli altri sistemi aziendali. Concettualmente possiamo ipotizzare di vedere diverse sedi dove sono presenti delle LAN connesse tra loro attraverso Internet, MAN o WAN. Il gruppo di LAN che condivide le risorse disponibili nelle varie sedi, dislocate anche a molti chilometri di distanza tra loro, viene definita Intranet. Le LAN che fanno parte di una intranet hanno normalmente indirizzi IP e subnet mask totalmente differenti, e si collegano tra loro attraverso router, gateway, proxy. Usi e vantaggi di una Intranet L'Osservatorio permanente sulle Intranet della School of Management del Politecnico di Milano, nato nel 2002 con l'obiettivo di comprendere lo stato delle applicazioni Intranet e dei nuovi Sistemi Informativi in Italia, ha evidenziato come dietro al termine Intranet si nascondono, nelle imprese, applicazioni assai eterogenee. Le intranet aziendali sono state classificate in quattro diversi modelli (Informative, Istituzionali, Operative e di Knowledge Management) in base ai servizi offerti, alla luce dei quali è stato possibile descrivere ed interpretare meglio gli approcci seguiti in termini di strategie, soluzioni di governance e scelte tecnologiche. Nel rapporto 2006 dell'Osservatorio, su un campione di più di 110 casi di studio, emerge come finalmente le Intranet mostrano segnali di evoluzione verso una prospettiva nuova ed ambiziosa. Pur conservando la loro natura di strumenti incentrati sulla persona, le Intranet avanzate integrano nuovi strumenti di comunicazione e collaborazione e si fondono con altri Sistemi Informativi tradizionali per creare i Virtual Workspace. La intranet serve ad evitare problemi di comunicazione interna. Anche un'organizzazione di dimensioni ridotte può avere problemi di comunicazione. La maggior parte del personale viene a conoscenza di certe situazioni chiacchierando durante la pausa caffè. Le storie si modificano man mano che passano di bocca in bocca e alla fine il personale è male informato e scontento. Se poi l'azienda o l'ente dispone di telelavoratori, lavoratori fuori sede, dipendenti che si spostano di frequente, oppure è un ente "virtuale", i problemi di comunicazione diventano ancora più critici. Perché un ente o un'azienda abbia successo, è necessario che tutti i dipendenti ne condividano gli obiettivi. Nessun obiettivo, a breve o a lungo termine, deve essere confinato alle riunioni. Tutti devono lavorare per obiettivi comuni. Una intranet è il mezzo ideale per pubblicare rapporti settimanali, promemoria; per dare vita a bacheche virtuali, messaggistica immediata e chat moderate. In questo modo, tutti dispongono delle medesime informazioni. Serve a risparmiare tempo: una intranet consente di pubblicare informazioni utili per tutti i dipendenti: dalle politiche

Page 30: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

aziendali alla richiesta di ferie, alla rassegna stampa, alla rubrica telefonica, ecc, e comporta un enorme risparmio di tempo. La intranet migliora l'utilizzo della posta elettronica. Inviare per posta elettronica più versioni dello stesso documento o della stessa presentazione può generare confusione e talvolta un eccesso di informazioni. Con una intranet, gli utenti possono lavorare su diversi file condivisi e disporre di una posizione centrale in cui salvare la versione più aggiornata. In questo modo si risparmia anche spazio sul server. Non è poca cosa: la presenza di diverse versioni di file su ciascun computer occupa spazio prezioso. Il concetto di intranet risale al 1994, anno in cui Steven Telleen concepì il termine. Alcuni anni dopo, in un'intervista, il ricercatore dirà: "Quando coniai il termine IntraNet alla Amdahl, nell'estate del 1994, questo sembrava più un Web interno, che un'Internet interna. Infatti il termine che usavamo tra di noi, prima, era l'ingombrante Enterprise Wide Web. Così, nonostante l'ambiguità del termine IntraNet rispetto a Internet, questo si diffuse per mancanza di alternative migliori. Ho usato la parola intranet per definire un'infrastruttura, basata sugli standard e sulle tecnologie di Internet, che condivide informazioni e contenuti all'interno di un gruppo limitato e ben definito. L'infrastruttura si riferiva alla matrice organizzativa e gestionale volta a creare, gestire e condividere i contenuti. L'unica limitazione tecnica era che la rete fisica doveva basarsi sull'Internet Protocol (IP)" Ad oggi l'aspetto di un'intranet varia da azienda ad azienda, prendendo forme anche completamente diverse a seconda degli obiettivi e delle teorie di management su cui il sistema viene costruito. A partire dalla metà degli anni '90 questo nuovo paradigma telematico ha impattato sulla mentalità, trasmettendo un cambiamento nella cultura aziendale e mettendo in discussione il sistema di gerarchie e abitudini consolidate. Intranet rappresenta la concezione della comunicazione in azienda, della trasparenza dei processi burocratici, della condivisione della conoscenza, della riduzione del lavoro inutile. Inoltre rafforza la capacità di controllo del centro aziendale sull'intera attività dell'impresa: le intranet divengono così uno dei pilastri della ristrutturazione organizzativa, sia per facilitare altri cambiamenti e sia per migliorare la velocità e la flessibilità dell'azienda stessa. EXTRANET L'extranet è una estensione di una LAN che permette anche a soggetti non operanti all'interno della suddetta rete di accedere a informazioni, servizi e consultare o immettere dati. Solitamente l'utilizzo delle stesse non equivale alla sua raggiungibilità, ma sono previste forme di autenticazione utente e di sicurezza nello scambio dei dati.

Page 31: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Descrizione Le tecnologie solitamente più utilizzate per accedere a una extranet sono:

• VPN - Viene creato un canale dedicato in cui le informazioni vengono trasportate in modo protetto, dopo una fase iniziale di riconoscimento dell'utilizzatore e negoziazione dei parametri di connessione. Richiede quindi un accesso a Internet da parte dell'utilizzatore, ma dopo l'instaurazione del canale privato saranno disponibili tutte le risorse presenti sulla extranet.

• Web Access - L'accesso alla Extranet è pubblicato su Internet, dopo una fase iniziale di riconoscimento dell'utilizzatore le funzionalità della Extranet sono messe a disposizione tramite un'interfaccia Web. Richiede quindi un accesso a Internet da parte dell'utilizzatore, e che parte dell'infrastruttura ricevente sia esposta sulla rete pubblica, solitamente su DMZ e protetta da firewall.

• Linea dedicata/Accesso diretto - Viene creato un canale dedicato in cui le informazioni vengono trasportate in modo protetto, si differenzia dal primo caso perché non richiede necessariamente l'accesso a Internet da parte dell'utilizzatore, e perché il canale dedicato viene costituito a un livello inferiore di quello del protocollo di trasporto.

Page 32: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

CRITTOGRAFIA

Il tema della sicurezza della corrispondenza è antico quanto il mondo, e da sempre l'uomo ha cercato il modo di proteggere i suoi segreti e la sua vita privata. Come non ricordare certi romanzi ambientati nella Francia degli imperatori, dove la ghigliottina era strumento di uso frequente, e le dame facevano di tutto per proteggere l'identità dei loro innamorati facendo ricorso agli espedienti più strani ? I primi esempi di uso della Crittografia si hanno addirittura all'epoca dell'impero romano, quando Giulio Cesare usava una chiave che potremmo definire "rot-3" per cifrare i suoi messaggi, ossia "scalava" le lettere di 3 posizioni (la A diventava C, la B diventava D e così via). Da questi primi episodi ovviamente è passato molto tempo, e le tecniche di crittografia si sono molto evolute. Si è passati attraverso segnali di fumo, corde con nodi particolari, inchiostri simpatici ecc. fino a tecniche di crittografia basate su macchine meccaniche prima (come la tedesca ENIGMA della seconda guerra mondiale) e computers poi. Attualmente ci sono parecchi algoritmi di crittografia che usano la grande potenza di calcolo dei moderni calcolatori elettronici, così come gli stessi calcolatori sono impiegati nella "criptoanalisi", ossia nel tentativo di decifrare quello che è stato codificato da altri. Cos'è la crittografia Per crittografia si intende quella tecnica che permette di "cifrare" un messaggio rendendolo incomprensibile a tutti fuorché al suo destinatario. In generale i due processi principali che vengono applicati in crittografia si dividono in "cifratura" e "codifica". La cifratura lavora sulle lettere "individuali" di un alfabeto, mentre una codifica lavora ad un livello semantico più elevato, come può essere una parola o una frase. I sistemi di cifratura possono lavorare per trasposizione (mescolando i caratteri di un messaggio in un nuovo ordine), o per sostituzione (scambiando un carattere con un altro carattere in accordo con una regola specifica), o una combinazione di entrambi. Nel linguaggio corrente la trasposizione è anche chiamata permutazione. Una cifratura che implementa entrambe le tecniche (trasposizione e sostituzione) è chiamata "cifratura composta". In linea di massima una cifratura composta è più sicura di una cifratura basata solo su sostituzione o su trasposizione. Shannon (l'inventore della teoria dell'informazione, N.d.R.) paragona la sostituzione alla "confusione", perchè l'output è una funzione non lineare dell'input. Egli inoltre ha paragonato la trasposizione alla "diffusione" perchè estende la dipendenza dell'output da un piccolo numero di posizioni dell'input a un grande numero. Ogni sistema di crittografia ha due parti essenziali: un algoritmo (per codificare e decodificare) e una "chiave", la quale consiste di informazioni che, combinate con il

Page 33: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

testo "in chiaro" passato attraverso l'algoritmo, vi darà poi il testo codificato. In ogni moderno sistema di crittografia si assume che l'algoritmo sia conosciuto dai potenziali "nemici", quindi la sicurezza di un sistema risiede solo ed esclusivamente nella segretezza della chiave. Il nostro obiettivo è quello di tradurre il linguaggio del testo in chiaro in un nuovo "linguaggio" che non può essere compreso e/o tradotto senza le informazioni supplementari fornite dalla chiave. A chi è familiare il concetto di entropia in fisica potrà essere sorpreso di scoprire che questo concetto è utile anche in crittografia. L'entropia è la misura della quantità di disordine in un sistema fisico, o della relativa assenza di informazione in un sistema di comunicazione. In un linguaggio naturale, come potrebbe essere l'italiano, l'entropia è bassa, in quanto vi è ridondanza e una certa regolarità statistica nei termini e nei caratteri. Se alcuni dei caratteri di una frase sono persi o incomprensibili noi di solito riusciamo a ricostruire la frase, con una buona approssimazione, nella grande maggioranza dei casi. Inversamente, noi vogliamo che il nostro testo criptato abbia la più alta entropia possibile, al fine di renderne il più difficile possibile la decodifica. Idealmente il nostro testo dovrebbe apparire come una serie di lettere o simboli casuali (random). Il nostro principio guida sarà quello di aumentare l'incertezza del criptoanalista il più possibile. La prima considerazione nella sicurezza di un sistema di crittografia riguarda la lunghezza della chiave. Se noi usiamo una chiave troppo corta (se comparata alla lunghezza del testo in chiaro) molto probabilmente l'algoritmo da noi usato, arrivato ad un certo punto della codifica, dovrà ripetere dei caratteri, o delle sequenze di caratteri, fornendo così uno schema che il criptoananlista potrebbe sfruttare per compiere il suo lavoro. Se la cosa dovesse ripetersi molte volte il criptoananalista potrebbe avere abbastanza materiale in mano per poter ottenere la nostra chiave. Un altro fattore importante da tenere in considerazione è il numero di chiavi che il mio algoritmo ammette. Se il mio algoritmo ammettesse, ad esempio, 10000 chiavi, io posso stare certo che un "nemico" dotato di mezzi di calcolo anche modesti potrebbe provarle tutte in un lasso di tempo accettabile, vanificando quindi il mio sistema di crittografia. Questo approccio (ricerca esaustiva su tutte le chiavi possibili) viene chiamato approccio di "forza bruta". Questo introduce il concetto del "fattore lavoro", necessario per rompere un sistema di crittografia. In linea di principio un sistema sicuro in assoluto NON esiste. Ma se noi possiamo fare in modo che il fattore lavoro necessario per romperlo sia il più alto possibile molto probabilmente ci saremo messi al riparo dalla grande maggioranza degli attacchi. Anche perchè il nostro avversario prima di lanciarsi nel tentativo di decodifica di un sistema complesso molto probabilmente eseguirà un bilancio costi-benefici. Se il beneficio che esso potrà avere dalla decodifica del nostro messaggio è inferiore allo sforzo (anche economico) che deve sostenere per decodificarlo (o per tentare di farlo) molto probabilmente lascerà perdere.

Page 34: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Cos'è la Criptoanalisi Per criptoanalisi si intende appunto "l'analisi" del testo cifrato nel tentativo di decodificare un messaggio codificato da altri e del quale non si possiede la chiave. I metodi di attacco possono variare da una complicata analisi statistica del testo criptato fino a penetrare in casa del soggetto, o nel suo ufficio, e rubargli (o copiargli) la chiave (questo approccio si definisce criptoanalisi "pratica"). NON vi sono regole di fair-play. Il Criptoanalista è libero di usare tutte le armi in suo possesso per scoprire la vostra chiave, anche la vostra ingenuità, che di solito si rivela l'arma migliore. Se per caso venisse a sapere che il vostro cane si chiama "Beethoven" potrebbe pensare che voi siete abbastanza ingenui da usare questo nome come chiave. A prima vista potrebbe sembrare strano, ma vi assicuro che nella maggior parte dei casi funziona. Anche chi deve impostare una password molte volte usa il proprio nome, o quello della fidanzata, moglie, amante, figlio magari seguito da un numero, tanto per "complicare" le cose. E' statisticamente provato che queste sono le password più facili da indovinare. Su una cosa del genere ci hanno addirittura fatto un film: Wargames. Il criptoanalista potrebbe avere solo il testo criptato su cui lavorare, oppure avere sia il testo criptato sia quello in chiaro corrispondente. Alcuni sistemi crittografici sono abbastanza buoni se l'analista dispone solo del testo criptato, mentre falliscono completamente se è disponibile sia il testo criptato sia quello in chiaro. Alcuni si chiederanno: "Ma se l'analista ha già il testo in chiaro, perchè perdere tempo per ottenere la chiave ?". Semplice: perchè avendo la chiave egli potrà decodificare tutti i vostri messaggi, anche quelli di cui non dispone del testo in chiaro. Il vostro sistema, quindi, dovrebbe essere abbastanza robusto da resistere ad entrambi gli attacchi, sia quelli portati al solo testo criptato, sia quelli condotti al testo criptato e al testo in chiaro. La potenza dei computer moderni può aiutare moltissimo il criptoanalista, ma molti sistemi che possono sembrare estremamente sicuri possono essere infranti semplicemente con carta e penna. Per esempio la famiglia "Vigenere" di cifratura polialfabetica è stata creduta inviolabile fino alla fine del diciannovesimo secolo. Una cifratura polialfabetica consiste nell'uso di un secondo alfabeto per sostituire le lettere del testo in chiaro. In questo sistema la chiave determina l'ordine in cui devono venire scambiate le lettere e il ciclo viene ripetuto con una periodicità pari alla lunghezza della chiave. Questa periodicità è un indizio "fatale", infatti il criptoanalista applica uno schema di questo tipo: "A cifra uguale corrisponde lettera uguale, e a blocco uguale corrisponde parola uguale". In questo modo si evidenzia la lunghezza della chiave. Una volta conosciuta la lunghezza della chiave possiamo applicare le tabelle di frequenza di lettere di un linguaggio per iniziare a ipotizzare quale potrebbe essere la chiave. Questo tipo di cifratura "Vigenere" può essere facilmente implementata su un moderno computer, ma ormai essa è ritenuta troppo "debole" per gli scopi attuali.

Page 35: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Alcuni sistemi crittografici Vediamo ora una brevissima sintesi di alcuni sistemi crittografici: La cifratura detta a chiave infinita o one-time pad consiste nel generare una chiave composta il più possibile da lettere, numeri e simboli disposti in modo casuale, e di una lunghezza almeno pari alla lunghezza del testo da criptare. Quindi per ogni carattere del testo in chiaro aggiungiamo (come somma di valori ASCII ad esempio) un carattere della chiave, ottenendo il testo criptato. E' facile intuire che una cosa del genere è praticamente impossibile da decifrare, in quanto si basa su una chiave ottenuta in modo assolutamente casuale (entropia massima) e senza la possibilità di analizzare delle ripetizioni nel testo, in quanto la chiave ha appunto la lunghezza stessa del testo. Questo sistema di codifica è usato per ottenere i più alti gradi di sicurezza militari, ma ha il grosso difetto di non essere impiegabile su vasta scala o per messaggi particolarmente lunghi. Alcuni algoritmi sono stati costruiti approssimando il sistema a chiave infinita con l'espansione di una chiave relativamente breve. Il sistema "Vernam", ad esempio, usato nelle trasmissioni telegrafiche, usava lunghi nastri di carta contenenti dei bit casuali, i quali erano aggiunti ai bit del messaggio originario. Il sistema a rotore prende il nome dalla macchina elettromeccanica tedesca ENIGMA usata nella seconda guerra mondiale. Essa era composta da ruote con i caratteri incisi sul bordo, e con contatti elettrici in corrispondenza delle lettere in entrambi i lati. Il testo in chiaro, digitato su una tastiera, veniva riprodotto utilizzando i caratteri di una ruota, la quale a sua volta veniva "rimappata" utilizzando i caratteri della seconda, e poi della terza, e così via. Tutti i rotori, e potevano essere parecchi, venivano "scalati", in modo che la sostituzione delle lettere fosse ogni volta diversa. La chiave consisteva nel settaggio iniziale dei rotori, che potevano essere posizionati in milioni di combinazioni diverse. Questo meccanismo è facile da costruire via software e abbastanza sicuro, può tuttavia essere infranto. Le storie che sono nate attorno alla decifrazione del codice ENIGMA da parte degli alleati hanno dato origine a parecchi libri e lo spunto anche per diversi film. Nel 1977 il "National Bureau of Standard" ha promulgato il DES (Data Encryption Standard) come il sistema di crittografia usato da tutte le agenzie federali (fatta eccezione per quegli atti che richiedevano un livello più alto di sicurezza). Il DES è disponibile in una pubblicazione governativa e anche in diversi libri. In origine era stato implementato solo in hardware, probabilmente per impedire una modifica delle sue tabelle interne, ma più tardi è stato implementato anche via software, tanto che esso ora è disponibile in parecchi pacchetti commerciali (come le famosissime Norton Utilities). Il DES è un algoritmo di cifratura composta che usava 16 passaggi di permutazione e sostituzione su blocchi di 64 bit ciascuno. Le tabelle di permutazione sono fisse, e la sostituzione è determinata dai valori di una chiave lunga 56 bit e dai

Page 36: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

blocchi del messaggio. Proprio la relativa brevità della chiave ha indotto alcuni esperti a credere che il DES potesse essere violato con relativa facilità cosa che poi è effettivamente accaduta. Il DES completo a 16 passaggi è stato attaccato con qualche successo da Biham e Shamir (uno dei creatori dell'algoritmo RSA, gli altri due erano Rivest e Adleman. N.d.R.) con l'uso della criptoanalisi differenziale, e da Matsui con l'uso della criptoanalisi lineare. Tuttavia il più devastante attacco pratico portato al DES è stato descritto alla conferenza Crypto '93, dove Michael Wiener del Bell Northern Research ha presentato un documento sull'apertura del codice DES con una macchina speciale. Egli aveva sviluppato e verificato un chip che provava 50 milioni di codici DES al secondo, fino a trovare quello giusto. Sebbene fino ad ora egli si sia astenuto dal produrre il componente in serie, può ottenerne la produzione per 10.50 $ al pezzo, e può inserirne 57000 in una macchina speciale con un costo di 1 milione di dollari. Questa macchina può provare tutte le chiavi DES in 7 ore, ottenendo la soluzione mediamente in 3,5 ore. Si può stornare e nascondere 1 milione di dollari dal budget di molte società. Spendendo 10 milioni di dollari la soluzione è ottenuta in 21 minuti, e 100 milioni di dollari assicurano un tempo di 2 soli minuti. Avendo a disposizione il budget di un qualunque governo per esaminare il traffico DES, il codice può essere violato in alcuni secondi. Tutto questo significa che il DES a 56 bits ormai è morto per ciò che riguarda le applicazioni serie di sicurezza dei dati. Un possibile successore del DES potrebbe essere una variazione conosciuta come "triplo DES", che usa due chiavi DES per cifrare tre volte , raggiungendo una lunghezza effettiva della chiave di 112 bits. Questo sistema è però tre volte più lento del DES normale. PGP usa una combinazione di diversi algoritmi, nella fattispecie RSA (crittografia a chiave singola), IDEA (crittografia a chiave pubblica, vedi più avanti) e MD5 (funzione di hash crittografico, cioè di verifica della firma). Le routines MD5 sono state sviluppate e rese di pubblico dominio da Ron Rivest. Per le persone crittograficamente curiose, la cifratura IDEA utilizza blocchi di 64 bits per il testo sia in chiaro che cifrato. Essa utilizza una chiave di 128 bits. È basata sulla filosofia della miscelazione di operazioni da diversi gruppi algebrici. È molto più veloce del DES e, come il DES, può essere usata in modo CFB (cipher feedback) o CBC (cipher block chaining). PGP usa l'IDEA in modo CFB a 64 bits. La cifratura a blocchi IPES/IDEA è stata sviluppata all'ETH di Zurigo da James L. Massey e Xuejia Lai, e pubblicata nel 1990. Non è un algoritmo "casalingo". I suoi progettisti hanno un'ottima reputazione nella comunità dei crittografi. I primi documenti pubblicati chiamavano l'algoritmo IPES (Improved Proposed Encryption Standard), ma più tardi il nome è stato cambiato in IDEA (International Data Encryption Algorithm). Fino ad ora, IDEA ha resistito agli attacchi molto meglio di altri algoritmi come FEAL, REDOC-II, LOKI, Snefru e Khafre. Prove recenti fanno ritenere che l'IDEA sia anche più resistente del DES agli attacchi portati da Biham e Shamir con la loro efficientissima criptoanalisi differenziale. Biham e Shamir hanno

Page 37: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

esaminato a fondo l'IDEA per trovare debolezze, senza successo. Gruppi accademici di criptoanalisti in Belgio, Inghilterra e Germania stanno cercando di attaccare l'IDEA, così come i servizi militari di diversi Paesi. Man mano che questo nuovo algoritmo attira le attenzioni e gli sforzi dei più formidabili gruppi del mondo della criptoanalisi, la fiducia in esso cresce col passare del tempo. Cos'è la Crittografia a chiave pubblica Il problema principale che affliggeva tutti i metodi di crittografia consisteva nello scambio della chiave, ossia nel prendere accordi con il destinatario del messaggio su quale codice usare. Supponiamo ad esempio che i due corrispondenti scelgano di scambiarsi messaggi tramite una corda con alcuni nodi particolari. È necessario che i due si incontrino almeno una volta e in gran segreto per concordare la sequenza e il significato dei nodi, altrimenti il messaggio risulterebbe assolutamente incomprensibile. È ovvio che se lo "scambio della chiave" fosse spiato da qualcun'altro quest'ultimo potrebbe a sua volta decifrare i messaggi una volta entrato in possesso della corda annodata, invalidando in questo modo l'intero sistema. Se dover far incontrare i due corrispondenti poteva essere problematico un tempo, quando magari i due abitavano a parecchi giorni di cammino l'uno dall'altro, è praticamente impossibile ai giorni nostri, almeno su vasta scala. Con l'avvento delle reti telematiche è possibile corrispondere con persone ai quattro angoli del globo, e ovviamente diventa impossibile andare a visitarle tutte. Questo problema ha impedito il diffondersi di sistemi di crittografia come ad esempio il DES che usano una sola chiave per codificare e decodificare il messaggio. Il problema è stato risolto in modo brillante da Whitfield Diffie, in collaborazione con il professor Martin Hellmann della Stanford University, che creò un sistema di cifratura detto "a chiave pubblica". Il concetto è abbastanza facile da capire; nei sistemi di crittografia usati fino ad allora la "password" era unica, sia per codificare che per decodificare il messaggio. Con i sistemi a chiave pubblica le cose non stanno più così le chiavi sono due, una per codificare e una per decodificare. Entrambe sono generate dal programma quando l'utente glielo chiede, e sono univoche, cioè non possono essere utilizzate per lo scopo inverso, ed è praticamente impossibile ottenere l'una quando si è in possesso solo dell'altra. Fatto questo basta rendere pubblica (appunto) la chiave per codificare e tenere ben nascosta quella per decodificare. In questo modo chiunque voglia mandarmi un messaggio potrà farlo, stando certo che io e solo io potrò leggerlo. Anzi, potrà a sua volta mandarmi, magari nella stessa mail, la sua chiave pubblica, così che io possa rispondergli in modo assolutamente sicuro. Ecco, è proprio partendo da questo principio che è nato PGP, il quale consente appunto di generare una coppia di chiavi, in congiunzione biunivoca tra loro, e di rendere pubblica ove si vuole la chiave per decodificare (anzi più viene pubblicizzata e meglio è) trattenendo per se la chiave privata. Anzi, mi permette di fare anche molte altre cose, ad esempio di lasciare un messaggio "in chiaro" e di "firmarlo" elettronicamente con la mia chiave privata, in

Page 38: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

gergo si dice che si effettua "l'hash" di un messaggio. Chiunque possegga la mia chiave pubblica potrà poi chiedere al programma di verificare che il messaggio riportato nel testo sia effettivamente quello che ho scritto io e che non sia stato modificato da altri. Cos'è il PGP Il PGP è l'acronimo di Pretty Good Privacy (ossia: "Una privacy niente male"), un programma di crittografia a chiave pubblica che permette di scambiarsi informazioni (anche riservate) in modo estremamente sicuro e veloce, cioè attraverso la posta elettronica. Ma PGP fa anche molte altre cose, ad esempio criptare un messaggio per uso "interno" (quindi usando un algoritmo a chiave singola), "firmare" il messaggio impedendo così delle modifiche da parte di estranei, codificare un qualsiasi file con il formato "Armor Radix 64", permettendone così l'invio tramite la posta elettronica e molto altro ancora. PGP è stato creato da Phil Zimmermann il quale ha messo a libera disposizione sia il programma compilato sia i sorgenti, cosicché chiunque può visionare ed eventualmente modificare (se ne è in grado e previa autorizzazione di Zimmermann stesso) il codice di PGP. L'uso di PGP è pertanto gratuito per un uso privato e non soggetto a nessuna forma di registrazione.

Page 39: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

LINGUAGGI DI SCRIPTING LATO CLIENT

I linguaggi di programmazione si dividono essenzialmente in tre grandi gruppi: linguaggi compilati, semi-compilati ed interpretati. Nel caso dei linguaggi compilati, il codice sorgente (ossia il file testuale contenente le istruzioni che devono essere eseguite da parte del personal computer) viene "impacchettato" sotto forma di un file eseguibile. I sorgenti vengono "tradotti" in codice macchina, comprensibile al personal computer, mediante l'utilizzo dei cosiddetti compilatori. Ciò comporta che un programma "trasformato" in codice macchina può funzionare solo ed esclusivamente in un particolare ambiente hardware-software. Tra i linguaggi semi-compilati, citiamo Java: nato per affiancare l'HTML, permette lo sviluppo e l'utilizzo di applicazioni indipendenti dalla piattaforma. Ciò significa che Java è indipendente dalla specifica piattaforma hardware-software: il programma Java viene compilato in Java Bytecode quindi interpretato ed eseguito dalla speciale Java Virtual Machine (ne esistono versioni per tutte le piattaforme hardware-software in circolazione). La terza categoria di linguaggi di programmazione è composta dai linguaggi interpretati: in questo caso, il codice sorgente viene proposto in chiaro, senza alcun tipo di codifica: sta al browser Internet interpretarlo ed eseguire le istruzioni elencate. I linguaggi interpretati possono quindi essere considerati come una sorta di "estensione" dell'HTML che non è un linguaggio di programmazione vero e proprio (nonostante sia spesso, in maniera colloquiale, erroneamente definito come tale...). L'HTML è soltanto una sorta di "impaginatore" che permette di impostare la posizione di testo ed immagini in una pagina web, di inserire tabelle, frame, liste puntate e numerate e così via, oltre a stabilire le proprietà caratteristiche (ampiezza, colore, allineamento,...) di ciascun elemento. Fatta eccezione per i form, l'HTML non ha in sé né strutture in grado di interagire con l'utente né strutture decisionali. L'HTML, insomma, è completamente statico. Prima di passare alla presentazione dei linguaggi dinamici, desideriamo porre l'accento su JavaScript, considerabile come il complemento di HTML. JavaScript è un linguaggio interpretato ed è un linguaggio di scripting. JavaScript è semplice perché si basa su un numero ristretto di oggetti di programmazione, tuttavia il suo utilizzo potrebbe non risultare indicato per lo svolgimento delle operazioni più complesse: procedure all'apparenza assai semplici, potrebbero infatti implicare lo sviluppo di script piuttosto complicati. JavaScript è sicuro e affidabile: proprio per la sua peculiarità di essere un linguaggio piuttosto limitato - per numero e complessità delle strutture che mette a disposizione - non si conoscono problemi di sicurezza e di affidabilità. Tutti i bug e le "falle" di sicurezza di JavaScript sono stati scoperti e risolti

Page 40: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

sin dall'uscita delle prime versioni. Tra le caratteristiche principali di JavaScript abbiamo già messo in luce come il codice sia in chiaro, ossia visibile da parte di chiunque, semplicemente servendosi della funzione Visualizza, HTML del browser, decida di consultare il codice HTML della pagina web che sta visitando. Il codice JavaScript, inoltre, viene processato ed eseguito sul client, ossia sul personal computer che sta visitando un determinato sito Internet. Si tratta di un aspetto importante che deve essere tenuto a mente: altri linguaggi di programmazione vengono detti lato server perché, ad ogni richiesta di connessione da parte di un personal computer (client), il server esegue le azioni previste dal programmatore e comunica al computer client (e quindi al suo browser Internet) il responso. Il codice JavaScript, invece, non viene interpretato ed eseguito sul server ma viene inviato "così com'è" al client: penserà, quindi, il browser Internet (per esempio Internet Explorer) ad interpretarlo e ad eseguire le istruzioni specificate. Il codice di uno script JavaScript deve essere quindi scaricato completamente da parte del browser installato sul personal computer client, prima di poter essere eseguito. In questo modo, JavaScript dispensa il server dall'effettuare una mole di lavoro aggiuntiva (il server non deve processare il codice JavaScript) ma costringe ogni client ad un'opera di interpretazione ed esecuzione degli script. E' bene, quindi, non realizzare in JavaScript, script troppo complessi, che richiedano, da parte dei client, elevati tempi di elaborazione. L'identikit di JavaScript - JavaScript è un linguaggio di scripting - Un linguaggio di scripting è un linguaggio di programmazione "ridotto all'osso" - Uno script JavaScript si compone di una serie di istruzioni eseguibili dal personal computer client - Il codice JavaScript è inseribile all'interno di una qualsiasi pagina HTML - JavaScript è un linguaggio aperto che può essere liberamente utilizzato da chiunque senza la necessità di acquistare una licenza d'uso - JavaScript è supportato da tutti i browser Internet La programmazione orientata agli oggetti Si sente sempre più spesso parlare di programmazione orientata agli oggetti (in inglese OOP, Object Oriented Programming). Pochi ne conoscono, però, il reale significato. Per far luce sull'argomento è sufficiente pensare un programma come un insieme di oggetti (oggetti software) che cooperano tra loro. Ogni oggetto è in grado di eseguire delle azioni particolari che vengono effettuate solo quando richiesto. L'esecuzione di un'azione è richiesta sempre da un altro oggetto software. Pensate ad un televisore: si tratta di uno strumento che, per esempio, sa accendersi, sa sintonizzarsi su canali specifici, sa spegnersi. Ogni azione è però richiesta esplicitamente da parte dell'utente,

Page 41: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

servendosi di un altro oggetto (il telecomando). In pratica, è il telecomando che invia al televisore un messaggio comunicandogli quale azione deve essere intrapresa. Il televisore poi è in grado di conoscere il suo stato attuale ossia le proprie proprietà (il televisore è acceso o spento? Su quale canale è sintonizzato?). Analogamente, anche gli oggetti software dialogano tra loro per mezzo di messaggi ed ogni oggetto è caratterizzato da un insieme di proprietà che ne descrivono lo stato. I linguaggi di programmazione più moderni fanno uso degli oggetti software per rendere la scrittura dei programmi più semplice e più intuitiva. Non è richiesta, infatti, al programmatore la conoscenza sul funzionamento "interno" dell'oggetto software (chi utilizza il televisore non deve sapere come sono strutturati i circuiti elettronici che gli permettono di funzionare): gli è sufficiente apprendere le modalità per colloquiare con lui, ossia i messaggi che possono essere inviati e l'effetto di ogni singolo messaggio (semantica). Semplificando molto, provate a pensare ad un ipotetico oggetto software chiamato "calcola distanze": tale oggetto è in grado di acquisire il nome di due città e di calcolare la distanza tra di esse. Possiamo supporre che tale oggetto software preveda l'invio di due messaggi: il primo per richiedere l'acquisizione dei nomi delle città da parte dell'utilizzatore del programma, il secondo per richiedere il calcolo della distanza tra le due città specificate. Le proprietà dell'oggetto saranno essenzialmente due: la prima permetterà di avere informazioni sul nome della prima città inserita; la seconda proprietà sul nome della seconda città. I valori di ogni proprietà sono memorizzati in appositi contenitori (porzioni della memoria) denominati variabili. Ciascun oggetto software è poi caratterizzato da alcuni metodi: essi descrivono le azioni che l'oggetto deve compiere non appena riceve un messaggio specifico. La programmazione orientata agli oggetti è, quindi, una tecnica di programmazione che permette di semplificare notevolmente alcuni concetti che riguardano lo sviluppo di programmi. Un esempio di linguaggio di programmazione orientato agli oggetti è Java (che non ha nulla a che fare con il JavaScript). Come inserire uno script JavaScript in una pagina web Per delimitare il codice JavaScript (oltre a quello proprio di altri linguaggi di scripting) all'interno delle proprie pagine HTML è necessario utilizzare gli speciali "marcatori": <SCRIPT> </SCRIPT> Nella pratica, vanno utilizzate le tag seguenti: <SCRIPT Language="Javascript"><!-- //--></SCRIPT>

Page 42: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Com'è facile notare, all'interno della tag <SCRIPT> è sempre bene specificare con quale linguaggio è stato realizzato lo script. Qualora si indichi anche la versione di JavaScript, lo script verrà interpretato ed eseguito solo dai browser che la supportano. Ad esempio, il codice contenuto all'interno delle tag che seguono verrà interpretato solo da Internet Explorer 4.0 o Netscape 4.0 e versioni successive: <SCRIPT Language="Javascript1.2"><!-- //--></SCRIPT> Omettendo l'indicazione della versione, il codice verrà processato da tutti i browser. In alternativa, è possibile utilizzare il tag <script type="text/javascript"> che consente, egualmente, di definire JavaScript come linguaggio di scripting. Il codice JavaScript può essere inserito direttamente all'interno di una pagina web oppure in un file esterno. Tale file dovrà poi essere opportunamente richiamato dal corpo della pagina HTML. Se si vuole inserire lo script nella pagina HTML, si deve tenere presente che questo può essere collocato all'interno delle tag <HEAD> e </HEAD> (ovvero nell'intestazione della pagina web), oppure tra le tag <BODY> e </BODY> (il corpo vero e proprio della pagina HTML). E' importante ricordare che gli script vengono eseguiti in maniera sequenziale, uno dopo l'altro, a seconda della loro posizione all'interno del codice HTML della pagina web. In particolare, gli script inseriti nell'intestazione tra le tag <HEAD> e </HEAD> vengono eseguiti per primi. I browser Internet e gli script Abbiamo già evidenziato come tutti i browser, soprattutto quelli di ultima generazione, siano in grado di processare i JavaScript, qualsiasi sia la loro versione. Ma cosa succede se la pagina web facente uso di JavaScript viene visualizzata con un browser obsoleto? Di solito o il codice non viene eseguito o si presentano problemi. Qualora, poi, l'esecuzione degli script fosse disattivata o si usassero browser che non supportano JavaScript, il codice presente nella pagina web non verrebbe processato. Spesso si ricorre, quindi, all'uso della tag <NOSCRIPT></NOSCRIPT> che permette di specificare il comportamento che il browser deve tenere qualora non fosse possibile interpretare lo script. Spesso si usa quindi il costrutto che segue: <NOSCRIPT> <META HTTP-EQUIV REFRESH CONTENT="0; URL=nomedellapagina.html"> </NOSCRIPT> In pratica, il tag <META REFRESH> ordina al browser, qualora questo non sia in grado di riconoscere adeguatamente lo script, di passare immediatamente alla

Page 43: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

visualizzazione della pagina HTML nomedellapagina.html. Il buon programmatore avrà cura di inserire, in tale pagina, una versione del sito visualizzabile con i browser più vetusti. Come regola generale, vi suggeriamo di racchiudere sempre il codice JavaScript tra le tag <! e --> che, in HTML, indicano i commenti. Questo perché alcuni browser (quelli più vecchi) qualora non riconoscano il codice JavaScript, potrebbero, anziché processarlo ed eseguirlo, visualizzarlo sulla pagina web (cosa che va assolutamente evitata). Delimitando, invece, gli script tra le tag <!-- e -->, i browser più vecchi, non in grado di riconoscere JavaScript, ne interpreteranno il codice semplicemente come commenti HTML (che non devono essere stampati sulla pagina web). Alcuni browser, soprattutto le versioni più datate di Netscape, hanno difficoltà nel gestire il segno > di fine commento: è bene perciò anteporre una doppia barra // (commento JavaScript) prima del tag -->. Create una nuova pagina HTML, servendovi di un normale editor testuale quindi copiate al suo interno quanto segue:

In questo script potete facilmente notare tutto quanto è stato sinora introdotto. In questo caso il codice JavaScript è stato inserito all'interno della tag <BODY> (corpo della pagina HTML). E' stato fatto uso delle tag <!-- e --> (per impedire ai browser più datati la visualizzazione dello script sulla pagina web) e della doppia barra finale (//). Le righe evidenziate in rosso sono istruzioni. In JavaScript ogni istruzione ha termine con il salto di riga (il ritorno a capo) oppure con il punto e virgola (;). Consigliamo di usare sempre il punto e virgola: vi consentirà di identificare più istruzioni che stanno sulla stessa riga. Eseguire uno script esterno Chi sviluppa una pagina web che fa uso di JavaScript, può decidere se inserire gli script direttamente nella pagina HTML oppure se utilizzare file esterni. La sintassi da usare è la seguente:

Page 44: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

<SCRIPT SRC=nomedelfilejavascript.js></SCRIPT> ove il file nomedelfilejavascript.js è il file contenente il codice JavaScript e che deve essere richiamato. I vantaggi che derivano dall'uso di file esterni sono enormi: se si prevede di utilizzare lo stesso codice JavaScript in più pagine HTML, si potrà semplicemente far riferimento al file esterno che lo contiene, senza doverlo riscrivere ogni volta. Supponiamo, ad esempio, che dieci pagine HTML del sito web che state realizzando debbano impiegare lo stesso codice JavaScript: basterà memorizzare lo script in un unico file di testo (ad esempio ilmioscript.js) e richiamarlo da ciascuna pagina servendosi della tag SCRIPT SRC. Ricorrendo a file esterni si attribuisce al sito che si sta realizzando una struttura modulare che porterà ad indubbi vantaggi in termini di spazio occupato (le pagine web saranno più snelle e compatte) e faciliterà eventuali modifiche del codice JavaScript (si dovrà intervenire solo sul file esterno e non sulla struttura di ciascuna pagina HTML), con grossi vantaggi in termini di tempo. Oggetti e proprietà Ricollegandoci con quanto introdotto poco fa circa la programmazione orientata agli oggetti, passiamo ad illustrare, nella pratica, il significato di oggetti e proprietà. Una pagina web, visualizzata all'interno del browser Internet, è considerabile come un oggetto. Ogni tabella, pulsante, immagine, form, link, presente nella vostra pagina web è un oggetto. Ogni oggetto dispone di un certo numero di proprietà che lo caratterizzano in modo univoco. Le informazioni per la visualizzazione del colore dello sfondo della pagina HTML sono, per esempio, memorizzate nella proprietà bgcolor dell'oggetto document. Utilizzando l'istruzione JavaScript document.bgcolor="red" alla vostra pagina web sarà assegnato, come colore di sfondo, il rosso. Il contenuto di un ipotetico campo denominato username, facente parte del form miologin, può essere recuperato utilizzando la proprietà value: document.miologin.username.value Notare che la proprietà value si riferisce all'oggetto username (campo testo) che è parte dell'oggetto miologin (form), il quale, a sua volta, è contenuto nell'oggetto document (la pagina web). Metodi I metodi descrivono le azioni che l'oggetto deve compiere non appena riceve un messaggio specifico. In pratica, i metodi sono le azioni che l'oggetto è in grado di compiere. Così come una porta può essere aperta o chiusa, una lampadina accesa o spenta, gli oggetti sono in grado di compiere molte azioni. Write() è, per esempio, un metodo dell'oggetto document: abbiamo già avuto modo di fare la sua prima superficiale conoscenza con lo script dell'Esempio 1:

Page 45: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

l'istruzione document.write("Benvenuto nel mondo di JavaScript!") ci ha permesso di scrivere la frase indicata sulla nostra pagina web. L'istruzione document.open() permette, invece, di aprire un nuovo documento (pagina web). Ecco una lista, non esaustiva, dei principali gruppi di metodi messi a disposizione in JavaScript: - Metodi di finestra - operano sull'oggetto Window e consentono di aprire e chiudere nuove finestre - Metodi di documento - permettono di generare "al volo" nuovi documenti (pagine HTML) - Metodi per i form - per selezionare gli oggetti che compongono un form (ad esempio un modulo di richiesta di informazioni), per spostare il cursore sulle caselle di testo dei forum - Metodi relativi alla cronologia - intervengono sulla cronologia dei siti web visitati - Metodi di data - permettono di operare su data e ora - Metodi di testo - per modificare le proprietà caratteristiche del testo - Metodi matematici - le principali funzioni matematiche - Metodi "messagebox" - per generare finestre di dialogo Se si vuole aprire una nuova finestra da JavaScript, è necessario - in primo luogo - fissare un nome identificativo da attribuirle (ad esempio Miafinestra). Sarà quindi possibile aprire la nuova finestra servendosi della seguente istruzione:

Miafinestra = window.open() Il metodo window.open permette l'utilizzo di tre parametri opzionali che possono essere inseriti all'interno delle parentesi tonde: - Un URL contenente la pagina HTML che deve essere visualizzata all'interno della nuova finestra - Un titolo per la finestra - Una serie di informazioni legate al "look" grafico della finestra (i.e. dimensioni, posizionamento,...) Eventi Gli eventi consentono di specificare quando - ed in quali condizioni (per esempio all'apertura di una pagina web, quando l'utente clicca su un pulsante, quando si muove il mouse su un determinato oggetto, e così via...) - un determinato script deve essere eseguito. A differenza di quanto visto sinora, gli eventi non vengono definiti all'interno

Page 46: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

della tag <SCRIPT> ma vengono generalmente immersi (a parte qualche caso) nel codice HTML della pagina web. Provate a creare una pagina web utilizzando il codice che segue:

L'intero codice, pronto per un "copia&incolla" è reperibile in questa pagina (02_eventi_.html) utilizzando la funzione Visualizza, HTML del proprio browser. In questo caso, il primo script ad essere eseguito è quello inserito immediatamente dopo l'apertura della tag <BODY>:ml'istruzione alert('Benvenuto!') mostrerà al visitatore un messaggio iniziale di benvenuto. L'esempio ci permette di provare sul campo l'utilizzo degli eventi: a tal proposito, ci si può subito rendere conto di come gli eventi JavaScript siano utilizzati all'interno del codice HTML. Onmouseover e Onclick sono due eventi: il primo viene attivato non appena l'utente porta il puntatore del mouse sull'oggetto cui la tag HTML fa riferimento; il secondo evento ha luogo quando l'utente "fa clic" con il tasto sinistro del mouse. Nel nostro esempio, l'evento Onmouseover viene attivato non appena il visitatore della nostra pagina web sposti il puntatore del mouse sull'immagine raffigurante il logo del nostro sito (memorizzato nella cartella /img). Si noti come l'evento JavaScript è stato immerso direttamente nella tag HTML <IMG> che consente la visualizzazione di un'immagine all'interno di una pagina web. Analogamente, l'evento Onclick è inserito in una tag anchor <A HREF... ed attivato non appena l'utente clicca sul link (nel nostro esempio, viene visualizzato il messaggio Stai per collegarti con IlSoftware.it prima di indirizzare il browser verso l'URL indicato nella tag anchor).

Page 47: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

LINGUAGGI SERVER SIDE PHP

Ogni operazione eseguita sul Web coinvolge un client ed un server. Un client è un dispositivo (ad esempio un browser) che effettua una richiesta ad un server remoto. Il server remoto attraverso un linguaggio di scripting (come per esempio PHP) interpreta la richiesta del client ed invia una risposta (ad esempio una pagina HTML, un oggetto JSON o un XML) al client. A questo punto il client è in grado di interpretare, a sua volta, la risposta ricevuta e fornirla all’utente; nel caso del browser riceverà una pagina HTML che mostrerà all’utente. PHP è un linguaggio per lo scripting server-side, ovvero un linguaggio che risiede in un server in remoto e che in fase di esecuzione interpreta le informazioni ricevute da un client grazie al Web server, le elabora e restituisce un risultato al client che ha formulato la richiesta. Supponiamo ad esempio di accedere ad una pagina di un sito Web in cui effettuare il login. Dal nostro browser all’interno di una pagina (ad esempio www.nomesito.com/login) inseriremo le nostre credenziali per l’autenticazione. Semplificando il più possibile, le azioni che vengono compiute saranno le seguenti:

• il browser effettua una richiesta con le credenziali al server remoto tramite il protocollo HTTP;

• il Web server riceve la richiesta e la interpreta verificando che i dati inviati siano corretti;

• il web server restituisce una risposta al client che potrà essere diversa a seconda del fatto che la risorsa richiesta sia disponibile o meno.

Quello di cui si occupa PHP è appunto elaborare i dati veicolati tramite una richiesta HTTP e fornire un’adeguata risposta al client. Nel nostro caso il linguaggio avrà il compito di verificare che i dati di login siano corretti e restituire una risposta diversa a seconda della validità delle informazioni ricevute; tale meccanismo viene rappresentato dalla figura seguente.

Page 48: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Figura 1. Richiesta client/server.

PHP si differenzia poi dai linguaggi di scripting client side, come per esempio JavaScript, per via del fatto che il sorgente viene eseguito nel server, generando markup HTML da inviare al client; quest’ultimo riceverà i risultati dell’esecuzione di un’applicazione ma il codice eseguito non sarà mai visibile. Storia PHP nasce nel 1994 dalla tastiera di Rasmus Lerdorf; inizialmente esso veniva presentato come una serie di Common Gateway Interface (CGI) binari scritti in C per tracciare il numero di visite all’interno della suo homepage personale. Da qui il primo nome del PHP: Personal Home Page. In seguito però verrà rinominato in Hypertext Preprocessor. Il progetto venne ripreso successivamente da Rasmus, riscritto e rilasciato integrando alcune funzionalità. A questo punto il linguaggio era diventato abbastanza noto presso la community Open Source, al punto che nel 1998 venne rilasciata la versione 3 che, alla fine dello stesso anno, coprirà circa il 10% dei server presenti in Rete. Nel 2000 verrà rilasciata la versione 4, fino ad arrivare alla prima release della versione corrente (5.x) nel luglio del 2004. Secondo gli ultimi aggiornamenti di w3techs, PHP risulta utilizzato nell’82% dei siti Web a livello mondiale, seguito dall’ASP con solo il 17%. È di gran lunga il linguaggio server-side più usato e deve gran parte del suo successo alla sintassi molto simile al C e alla sua facilità di apprendimento. Caratteristiche e vantaggi del PHP Come detto nel paragrafo precedente, il PHP appartiene alla famiglia dei linguaggi C-Like, ovvero quei linguaggi la cui sintassi è molto simile a quella del C. Vediamo nella

Page 49: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

seguente tabella alcune differenze e similitudini tra quest’ultimo e PHP, i punti elencati verranno poi approfonditi nel corso delle trattazione. Linguaggio C Linguaggio PHP

Tipizzazioni molto forte Tipizzazione debole

Paradigmi supportati: imperativo, procedurale, strutturato

Paradigmi supportati: imperativo, funzionale, object-oriented, procedurale, riflessivo

Supporta i puntatori Non supporta i puntatori

Utilizzato principalmente per software Desktop Utilizzato principalmente per applicativi Web

Operazioni con le stringhe particolarmente complicate Operazioni con le stringhe molto semplici da effettuare

Non supporta I/O filesafe Supporta I/O filesafe

Non supporta system calls Supporta system calls

Tipi di dati numerici supportati: int8_t, unint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, int, unsigned int, signed char, unsigned char, short, unsigned short, long, unsigned long, long long, unsigned long long

Tipi di dati numerici supportati: 32-bit signed int, 64-bit signed int (long integer)

Tipi di dati float supportati: single precision float, doublelong double

Tipi di dati float supportati: double precision float

Supporta array di dimensioni fisse Non supporta array di dimensioni fisse

Non supporta array associativi Supporta array associativi Il PHP è stato sviluppato principalmente per il Web, questo implica che la maggior parte delle sue caratteristiche sono state implementate in funzione di esso. Il linguaggio, ad esempio, consente di accedere in maniera semplicissima alle richieste HTTP di tipo GET e POST. La specifica HTTP definisce 9 tipi di metodi alcuni dei quali non sono però usati o supportati dal PHP; i più diffusi restano sicuramente i già citati GET e POST. GET è il metodo con cui vengono richieste la maggior parte delle informazioni ad un Web server, tali richieste vengono veicolate tramite query string, cioè la parte di un URL

Page 50: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

che contiene dei parametri da passare in input ad un’applicazione (ad esempio www.miosito.com/pagina-richiesta?id=123&page=3). Il metodo POST, invece, consente di inviare dati ad un server senza mostrarli in query string, è ad esempio il caso delle form. Un’altra caratteristica importante è l’accesso in lettura/scrittura ai cookie del browser e il supporto alle sessioni sul server. I cookie sono delle righe di testo usate per tenere traccia di informazioni relative ad un sito Web sul client dell’utente. Le sessioni sono utilizzate anch’esse per memorizzare informazioni relative all’utente, ma vengono salvate sul server e non sul client; esse vengono utilizzate, ad esempio, per gestire l’accesso a contenuti riservati da parte di utenti registrati. Questi argomenti verranno trattati in dettaglio nella sezione dedicata ai dati e alla sicurezza. PHP fornisce delle librerie per accedere alla maggior parte dei database (MySQL, Postgres, SQLite..), per interagire con i server Web (Apache..), per manipolare le immagini (GD), per effettuare connessioni remote (cUrl) e molto molto altro, inoltre, anche se nato come linguaggio per Web, potrà essere utilizzato come linguaggio per lo scripting da riga di comando. Uno dei punti di forza del PHP è la community molto attiva. Sono migliaia le librerie di terze parti che ampliano le funzionalità di base e, nella maggior parte dei casi, sono tutte rilasciate con licenza Open Source. Numerosissimi anche i framework sviluppati con questo linguaggio (Zend Framework, Symfony Framework, CakePHP..) così come anche i CMS (WordPress, Drupal, Joomla..). PHP è multipiattaforma, cioè può essere utilizzato sia in ambienti unix-based (Linux, Mac OSX) che su Windows. La combinazione più utilizzata, però, resta quella LAMP ovvero Linux come sistema operativo, Apache come Web server, MySQL per i database e PHP.

Page 51: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

INTRODUZIONE AL LINGUAGGIO C++

Nato nel 1983 dall’ingegno di Bjarne Stroustrup, allora ricercatore presso AT&T, C++ è tra i primi 5 linguaggi più utilizzati al mondo. I campi di applicazione sono i più svariati: dal gaming alle applicazioni real-time, dai componenti per sistemi operativi ai software di grafica e musica, dalle app per cellulari ai sistemi per super-computer. Praticamente, C++ è ovunque. Negli anni si sono avvicendate diverse versioni di questo linguaggio di programmazione, introducendo via via diverse modifiche ed alcune caratteristiche che ne fanno ancora un linguaggio assolutamente importante e moderno. Programmazione Orientata agli Oggetti Il C++ è un linguaggio pensato per la programmazione orientata agli oggetti, che rende questo linguaggio una piattaforma ideale per realizzare progetti di grosse dimensioni, favorendo l’astrazione dei problemi. Ciò ci consente di sviluppare software seguendo i più moderni pattern di progettazione: esistono moltissime librerie già pronte e riutilizzabili, integrabili con i progetti grazie ad opportune strategie e design pattern come Adapter o Facade. Efficienza e versatilità C++ mette insieme l’espressività dei linguaggi orientati agli oggetti con l’efficienza e la compattezza del linguaggio C dal quale discende e di cui eredita potenza, flessibilità e la possibilità di programmare a basso livello. Questo ci permette di scrivere programmi di tutte le dimensioni, utilizzando ricchi stack di framework per dialogare ad alto livello, oppure lavorare a basso livello fino ad arrivare all’intergrazione di istruzioni assembly. Portabilità Esistono compilatori di C++ praticamente per tutte le piattaforme e sistemi operativi, e con le dovute accortezze (spesso non banali) si può pensare di ricompilare un software e farlo girare in diversi contesti applicativi. Questo grazie al fatto che C++ è definito come standard.

Page 52: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Va detto che in generale il compilatore crea codice destinato direttamente al sistema operativo, ma ci sono anche casi in cui il sorgente viene compilato in bytecode per girare su macchine virtuali, come accade per esempio con il Visual C++ e il runtime CLR di Microsoft. Anche in questo caso, comunque, strumenti come Mono garantiscono una certa portabilità del codice. Equivoci: procedurale o ad oggetti? Per molti C++, specie nei suoi primi quindici anni di vita, è stato un ponte tra i costrutti tipici dei linguaggi procedurali standard, familiari a molti programmatori che tipicamente passavano da C a C++, con il modello di programmazione orientata agli oggetti. Questa dualità, che avrebbe dovuto essere un vantaggio, spesso si è rivelata un problema per chi, abituato ad un approccio procedurale, era portato a creare mix esplosivi di classi con centinaia di righe di codice scritte con approccio procedurale (i cosiddetti code monsters). Oggi, grazie alla grandissima diffusione della programmazione orientata agli oggetti anche a livello accademico, sta scomparendo la tendenza ad utilizzare linguaggi e metodologie procedurali, che benché per certi versi più semplici, limitano l’uso di stratagemmi e tecniche per il mantenimento e il riuso del codice. Programma compilato e interpretato Un programma viene sviluppato scrivendo il codice sorgente in un opportuno linguaggio definito, appunto, dalla sintassi del linguaggio stesso. La differenza tra compilazione ed interpretazione è molto importante ed influisce sia sulle prestazioni che sulle possibilità del linguaggio stesso. Linguaggi come il C, C++, Delphi, Visual Basic sono linguaggi compilati e seguono questi passi: si scrive il codice in un editor, al più utilizzando un ambiente di sviluppo IDE che ne facilita la creazione, questo codice viene poi controllato per verificare che non ci siano errori e poi viene compilato, ovvero ogni istruzione viene trasformata nel corrispondente codice in linguaggio macchina che può essere, così, eseguito dal processore; questi sono i linguaggi compilati che vengono detti anche linguaggi imperativi, ed hanno il vantaggio di prestazioni migliori. I linguaggi interpretati, invece, seguono una strada diversa, il codice sorgente viene, appunto, interpretato al volo e vengono, quindi, eseguite le istruzioni così come descritte nel codice sorgente; un esempio su tutti è il PHP il cui codice viene “elaborato” e restituisce una pagina html pura. La potenza di questo genere di linguaggi è, di fatto, l’alta portabilità e l’immediatezza tra quello che scriviamo e quello che viene presentato all’esecuzione del programma, ma rimangono dei problemi come la ricerca

Page 53: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

di errori nel codice sorgente o il carico di lavoro maggiore per il processore (che ogni volta deve elaborare la pagina). Un linguaggio che è a metà strada tra queste metodologie è Java che è sia compilato che interpretato; il codice sorgente viene compilato in un formato intermedio (chiamato bytecode), il quale a sua volta viene interpretato dalla Java Virtual Machine (JVM), che ha il compito di interpretare “al volo” le istruzioni bytecode in istruzioni per il processore; la JVM viene sviluppata per ogni Sistema Operativo e permette di astrarre la macchina virtuale creata dal SO ad un livello di standardizzazione superiore (data di fatto dalla creazione della virtual machine sopra un’altra virtual machine) che rende, in pratica, JAVA altamente portabile. Questa metodologia implica la possibilità di controllare eventuali errori del codice sorgente (grazie alla compilazione), di creare programmi relativamente leggeri (il bytecode è un formato che crea file di dimensioni ragionevoli), ma ha la pecca di avere delle prestazioni non proprio soddisfacenti, questo perché il codice viene interpretato dalla JVM che a sua volta deve delegare l’esecuzione vera e propria al Sistema Operativo. Le peculiarità del C Quali sono le peculiarità del C? Sono molte e qui di seguito elenchiamo quelle più importanti cercando di chiarirne il significato. Dimensioni del codice ridotte – Generalmente il codice sorgente di un programma in C ha un peso (in Kb) relativamente piccolo, in questo modo risulta molto agevole trasportare il codice da un PC ad un altro, anche usando un semplice floppy. Dimensioni dell’eseguibile ridotte – Anche una volta compilato, un programma in C, risulta molto piccolo e quindi di più facile diffusione; ovviamente un programma in C potrà essere eseguito solamente sul medesimo Sistema Operativo per cui è stato compilato. Efficienza dei programmi – Un programma scritto in C, proprio per la possibilità messa a disposizione dal linguaggio di gestire a fondo la memoria, e per le sue dimensioni ridotte, risulta particolarmente efficiente. Può essere compilato su una vasta gamma di computer – Ogni computer può differire dagli altri per almeno due cose, l’architettura ed il sistema operativo; ad esempio un computer con processore x86 e Windows ha delle istruzioni (intese come istruzioni del processore) ed una gestione della memoria diverse da uno Sparc con Linux, però un programma scritto in C può essere compilato su ambedue le macchine, data l’alta disponibilità di compilatori per diverse piattaforme. Certo non è “portabile” come Java,

Page 54: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

però il fatto di essere sulla scena da molti anni e la sua enorme diffusione ne fanno, di fatto, uno strumento altamente portabile. È un linguaggio di alto livello – Un linguaggio di programmazione viene definito di alto livello tanto più si avvicina alla terminologia umana, inversamente si dice che un linguaggio è di basso livello se il suo codice si avvicina al linguaggio macchina (quello formato da 0 ed 1); tipico esempio di linguaggio a basso livello è l’Assembler, mentre linguaggi ad alto livello sono, oltre al C, il C++, il Java e molti altri. La particolarità dei linguaggi ad alto livello è quella di avere una semplice sintassi in cui si usano parole della lingua inglese per descrivere comandi corrispondenti a decine di istruzioni in assembler o centinaia di istruzioni in linguaggio macchina. Può maneggiare attività di basso livello – Il C è considerato il linguaggio di più basso livello tra i linguaggi di alto livello. Questo è dovuto al fatto che ha poche istruzioni, gestisce in maniera efficiente la memoria ed è possibile inserire direttamente all’interno di un file in C del codice Assembler. Implementazione dei puntatori – Il C fa un largo uso di puntatori per le operazioni riguardanti la memoria, gli array, le strutture e le funzioni. Loose Typing – In poche parole in C i tipi di dato delle variabili non devono necessariamente essere dichiarati; contrariamente, nel Pascal, nel C++ e nel Java i tipi devono essere dichiarati (strong typing); tale differenza risiede nelle scelte decisionali del progettista del linguaggio, che può volere più o meno flessibilità all’interno dello stesso (compilando un programma Java, la maggior parte delle volte si commettono errori di tipo). C’è chi dice che il metodo loose typing permetta al programmatore di commettere errori di tipo che potrebbero compromettere l’esecuzione del programma, ma è anche vero che con lo strong typing siamo costretti a seguire delle regole rigide che, a volte, non permettono di risolvere “velocemente” un problema. Storia del linguaggio C Per capire le origini del C, bisogna parlare della storia del sistema operativo UNIX in quanto è stato sviluppato su questo sistema operativo ed, anzi, lo stesso sistema operativo ed i suoi programmi sono scritti in C. Nonostante tutto il linguaggio C non è, però, legato solo alla programmazione dei sistemi operativi, ma con esso possono essere scritti (e sono stati scritti) grossi programmi di calcolo, word-processing e database. Ken Thompson nel 1969 iniziò a lavorare su un computer di nome PDP-7, utilizzando il linguaggio assembler; l’idea di base era di scrivere un linguaggio ad alto livello per l’implementazione di sistemi operativi. Thompson prese spunto dal CPL (Combined Programming Language) e dal BCPL (Basic CPL – 1967) per creare il linguaggio B che risultava, però, essere ancora troppo pesante per l’hardware a disposizione. Nel 1972, un collaboratore di Thompson, Dennis Ritchie ottimizzò

Page 55: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

ulteriormente il B (creando una prima versione chiamata NB), restituendogli alcune funzionalità del BCPL ed inventando quello che ad oggi viene chiamato Linguaggio C, che permise di riscrivere quasi totalmente lo UNIX di Thompson, questa volta per un computer più avanzato, il PDP-11. Inaspettatamente il C permise di riscrivere lo UNIX per il PDP-11 in tempi rapidissimi e ciò spinse Thompson, Ritchie e Kernighan a scrivere il kernel anche per l’ “Interdata 8/32” ed il “Dec VAX 11/780”, quest’ultimo, all’epoca, particolarmente popolare. Tra il 1973 ed il 1980 il linguaggio C si diffuse anche su architetture Honeywell 635 e IBM 360/370, grazie al lavoro ad opera del ricercatore Johnson che sviluppò il compilatore ppc, alla nascita delle prime librerie (un certo Lesk sviluppò il “portable I/O package”, rinominato “standard I/O library”) e alla scrittura di un libro di riferimento da parte Kernighan e Ritchie nel 1978, il “C Programming Language”, o come viene comunemente chiamato “Libro bianco”. In questi anni c’era un po’ di confusione, primo perché il C non era uguale a quello che conosciamo oggi, ma manteneva una compatibilità con i linguaggi da cui derivava (il BCPL ed il B), ed il “Libro bianco” era nato proprio dall’esigenza di scrivere codice portabile che permettesse l’evolversi del linguaggio. Negli anni ’80 i compilatori erano basati principalmente sul pcc di Johnson, ma nacquero molti compilatori indipendenti che non erano conformi al pcc, ma che permisero la diffusione del C praticamente su tutte le macchine più popolari; per questo il comitato ANSI (American Standards Institute) X3J11, nel 1983, iniziò a sviluppare uno standard per il linguaggio C, aggiungendo importanti caratteristiche ed ufficializzando molte caratteristiche presenti nei diversi compilatori. Nel 1989 si arrivò quindi allo standard ISO/IEC 9899-1990 (che chiameremo ANSI89 per comodità) che venne usato come base per tutti i compilatori. Nel medesimo periodo ci fu un’altra importante standardizzazione che mirava a definire l’interfaccia tra linguaggio e sistema operativo. Prendendo spunto proprio dall’ANSI89, fu creata la “Portable Operating System Interface” (POSIX) ad opera dell’IEEE (Institute of Electrical and Electronics Engeneers) che definisce, inoltre, i concetti di thread, socket, estensioni realtime e molto altro, in modo unico e indipendente dall’implementazione. Nonostante negli anni il C sia stato implementato sia con lo standard ANSI, che in maniera proprietaria, grazie a questi strumenti il C è diventato (ed è tutt’oggi) il linguaggio più utilizzato al mondo, almeno fino all’avvento del C++ (chiamato originariamente “C con classi”) che è stato anche la spinta del miglioramento nel tempo del C attraverso lo standard ANSI, di cui è stata rilasciata un’ultima versione denominata ANSI99, che è supportata dalle ultime versioni del gcc.

Page 56: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

LA COMPILAZIONE DI UN PROGRAMMA C

Come già detto un programma in C può essere scritto anche con un semplice editor di testi come il Blocco note di Windows (o simile). Per poter vedere il risultato del codice dobbiamo salvare necessariamente il file con un’estensione “.c”, ad esempio “hello.c”. A questo punto non dobbiamo fare altro che compilare il programma. In realtà la compilazione di un programma in C (spesso integrata in ambienti di sviluppo e quindi apparentemente trasparente ed uniforme) segue varie fasi:

• Il codice sorgente viene controllato dal preprocessore che ha i seguenti compiti:

• rimuovere eventuali commenti presenti nel sorgente;

• interpretare speciali direttive per il preprocessore denotate da “#“, come #include o #define.

• controllare eventuali errori del codice

• Il risultato del preprocessore sarà un nuovo codice sorgente “pulito” ed

“espanso” che viene tradotto dal compilatore C in codice assembly;

• L’assembler sarà incaricato di creare il codice oggetto salvandolo in un file (.o sotto Unix/Linux e .obj in Dos/Windows);

• Il Link editor ha il compito di collegare tutti i file oggetto risolvendo eventuali

dipendenze e creando il programma (che non è altro che un file eseguibile). Ricordiamo che tutte queste operazioni, per quanto molto avanzate, possono individuare facilmente errori di sintassi, ma mai e poi mai potranno trovare errori logici (come ad esempio un ciclo che non finisce), anche se spesso vengono segnalati dei Warning che non costituiscono errore, ma che segnalano parti di codice strane e quindi sulle quali porre attenzione per eventuali errori logici. Qui ci viene in aiuto il debugger che ha il compito di aiutare a gestire la correzione degli errori con svariati strumenti come i breakpoint ed i watchpoint. Avete ancora il vostro file “hello.c”? spero di si, perché è giunto il momento di compilarlo; se possedete un ambiente di sviluppo come Dev-C++ o Visual C++ dovete solamente cercare il comando “Compila” od “Esegui”, il programma provvederà, non solo ad eseguire tutte le operazioni citate, ma, una volta compilato, manderà in esecuzione il vostro programma presentandovi il risultato a video.

Page 57: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Per chi stesse usando, invece, compilatori come il DJGPP o GCC, la compilazione (intesa in tutte le sue fasi) deve essere fatta da riga di comando (dalla shell per capirsi), e, successivamente, sempre da riga di comando, si deve lanciare il file eseguibile risultante (in linux con gcc, di default il file eseguibile si chiama a.out, mentre in ambiente Dos/Windows generalmente ha lo stesso nome del sorgente ma con estensione .exe, invece che “.c”). Per compilare basta posizionarsi nella solita cartella dove risiede il file sorgente e scrivere:

# gcc hello.c Adesso avete visto un riassunto di come si possa scrivere un programma e compilarlo, tanto perché non vi troviate disarmati quando procederemo con le spiegazioni; molti dei concetti sopra esposti verranno approfonditi mano a mano che procediamo, come la strutturazione del linguaggio, la compilazione, le funzioni disponibili nelle varie librerie. Esempio pratico Sebbene il programma di esempio presentato sia abbastanza grande, si può notare che ricalca perfettamente la semplice struttura spiegata in questa lezione. 11 #include <stdio.h> [...] 58 int main() 59 { [...] 140 } Elementi fondamentali di un programma in C A cosa serve l’#include? Cosa è il main()? A cosa servono le graffe? E i punti e virgola? Procediamo con ordine riportando il codice scritto nella lezione precedente: #include <stdio.h>

Page 58: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

main () { printf(“Hello World!”); }

• #include è una direttiva del preprocessore, un comando, che permette di richiamare le librerie standard del C. Senza librerie un programma non avrebbe a disposizione i comandi per eseguire anche le operazioni più semplici, come leggere un file o stampare a video una scritta.

• La funzione principale in un qualsiasi programma in C è la main() che, in questo

caso, non ha parametri, ma può ricevere anche degli input da riga di comando. Il main è indispensabile ed unico e deve esserci sempre;

• Le parentesi graffe servono, invece, per delimitare blocchi di istruzioni, o come

vengono abitualmente chiamate “statement”, che sono eseguite in ordine, da quella più in alto, giù fino all’ultima;

• Il punto e virgola, invece, serve per “chiudere” un’istruzione, per far capire che

dopo quel simbolo inizia una nuova istruzione. Entrando nel dettaglio della sintassi del Linguaggio C, possiamo notare che la prima funzione che incontriamo e che è anche una delle più usate è printf(), adibita a stampare a video tutto quello che gli viene passato come argomento e che fa parte della libreria <stdio.h>, senza la cui inclusione, non avrebbe senso. All’interno di un programma C possono essere inseriti dei commenti, basti sapere, per adesso, che esistono due modi:

• // – Tutto quello che sta a destra sulla medesima riga viene considerato commento e viene ignorato (ai fini dell’interpretazione del linguaggio) dal compilatore;

• /* … */ – Tutto quello che è compreso tra i due asterischi viene considerato

commento; questa forma viene utilizzata per commenti su più righe.

Page 59: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

ELEMENTI FONDAMENTALI DEL C Cosa sono le variabili Adesso è fondamentale definire il concetto di variabile, visto che nelle prossime lezioni faremo largo uso di questo termine. Pensiamo, ad esempio, a quando salviamo un numero di telefono di un nostro amico sul cellulare; se vogliamo chiamare il nostro amico, basterà inserire il suo nome (nome della variabile) ed il cellulare comporrà automaticamente il numero di telefono (valore della variabile). Si può vedere quindi che una variabile esiste in funzione del nome e del suo valore corrispondente; la comodità risiede (come nel cellulare) nel poter usare un nome per valori, che possono essere numeri o lettere, di grande entità o difficili da ricordare. Un altro vantaggio, non da sottovalutare, è la possibilità di usare il nome della variabile al posto del suo valore per eseguirvi sopra delle operazioni, con la possibilità, in seguito, di modificare il valore come e quante volte vogliamo. Detto con un gergo più tecnico, le variabili non sono altro che dei contenitori, identificati da un nome univoco, di un qualsiasi valore, sia esso un numero o una stringa. Per poter fare qualcosa di concreto all’interno dei programmi dobbiamo utilizzare le variabili in cui il pregio di avere un corrispondente nome-valore permette di gestire i cambiamenti di valore ad esse associati, fornendo quindi quella dinamicità necessaria ad eseguire operazioni complesse e/o ripetitive con il minimo sforzo. Le variabili vengono definite da un tipo e da un nome. Il nome per identificare una variabile (o una funzione o una costante) viene comunemente riferito come identificatore. Un identificatore è costituito da una o più lettere, cifre o caratteri e deve iniziare con una lettera o il carattere di sottolineatura (underscore “_” ); la loro lunghezza massima dipende dal compilatore, ma generalmente non si possono superare i 31 caratteri, ed inoltre il C è case-sensitive, quindi si fa distinzione tra lettere maiuscole e lettere minuscole. Questa piccola parentesi è dovuta, visto che in seguito parleremo appunto delle funzioni e delle costanti per le quali dovranno essere chiare le regole per assegnare un nome “formalmente” corretto. Il tipo della variabile indica quale tipo di valori può assumere il contenuto della variabile stessa, si può ben capire che un tipo intero conterà soltanto dei numeri, mentre il tipo carattere conterrà solamente lettere dell’alfabeto, numeri e simboli; Va fatto notare che l’intero ‘7’ è estremamente diverso dal carattere ‘7’, infatti l’intero viene trattato come un numero e su di esso si possono svolgere le più svariate operazioni matematiche, mentre il carattere viene gestito come un simbolo (si tratti di una lettera o di un numero).

Page 60: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Tutto ciò ha una spiegazione logica che risiede nella rappresentazione del numero stesso; se l’intero 7 viene rappresentato da un byte (otto bit) come 00000111, il carattere 7 viene rappresentato con un byte ma seguendo quella che è la codifica ASCII, quindi appare, a livello di bit come 00110111 che equivale ad una rappresentazione intera di 55. Le operazioni che permettono di convertire una variabile da un determinato tipo ad un altro (ad esempio da una lettera ad un numero) prendono il nome di casting, trattato nel capitolo 12 di questa guida. Tutte le variabili, prima di essere utilizzate, devono essere dichiarate, cioè deve essere detto al compilatore il tipo della variabile ed il suo nome (es. int x), questo per permettergli di allocare la memoria necessaria alla variabile stessa; la dichiarazione generalmente viene fatta all’inizio del programma, ma in programmi di grandi dimensioni può trovarsi anche in altre posizioni (o altri file), ma bisogna ricordare che comunque la dichiarazione di una variabile può essere fatta una ed una sola volta. Successivamente la variabile deve essere inizializzata, cioè le deve essere assegnato un valore, operazione che generalmente viene fatta contemporaneamente alla dichiarazione. // solo dichiarazione int x; // inizializzazione x = 10; // dichiarazione ed inizializzazione int y = 15;

Le variabili in C In C esistono diversi tipi di variabili, che servono per rappresentare tipi di dato diversi, dai grossi numeri ai testi. Alcuni linguaggi permettono la dichiarazione di variabili generiche, ma poter assegnare a ciascun dato il tipo di variabile adeguato, consente anche una migliore gestione della memoria (alla fonte). Nella tabella seguente sono mostrati i vari tipi, la parola chiave C che li identifica (char per carattere, int per intero, etc.), la tipologia di informazioni che rappresentano ed il numero di byte necessari per la loro rappresentazione in C: Tipi di dichiarazione Rappresentazione N. di byte

char Carattere 1 (8 bit)

Page 61: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

int Numero intero 2 (16 bit)*

short Numero intero “corto” 2 (16 bit)

long Numero intero “lungo” 4 (32 bit)

float Numero reale 4 (32 bit)

double Numero reale “lungo” 8 (64 bit) Nota: tradizionalmente, e per alcuni compilatori più obsoleti è ancora così, l’intero è di 16bit. Dalla versione C99 dello standard, il linguaggio prevede che si possano utilizzare interi a 32bit, indicazione adottata dalla maggior parte dei moderni compilatori. Si può effettuare un semplice test sfruttando la funzione sizeof(int). Char Il tipo char può contenere qualsiasi carattere definito secondo lo standard ASCII, quindi qualsiasi lettera (maiuscola o minuscola), cifra (da 0 a 9) e simbolo previsto dalla codifica. È molto importante ricordare che un char può contenere uno ed un solo carattere. Per memorizzare una successione di caratteri, alcuni linguaggi adottano un tipo stringa (string ad esempio), in C, invece, utilizziamo un array di char. L’array è un contenitore di variabili dello stesso tipo e ne approfondiremo la conoscenza più avanti. Per dichiarare una variabile char, ad esempio inizializzandola con la lettera ‘r‘, basta scrivere:

char a = 'r'; Int Il tipo int permette di rappresentare numeri interi. Possiamo dichiarare un int con due varianti: short e long, anche se in realtà un tipo int è già di per se’ un tipo short, mentre il la keyword long permette di estendere (utilizzando due byte in più) il range dei valori che il tipo int può assumere, consentendoci di lavorare con grandi numeri. I numeri interi, rappresentati da int, sono quelli “senza la virgola” o parti frazionate. Esaminiamo un pezzo di codice in cui dichiariamo ed inizializziamo variabili intere ed eseguiamo una divisione (/), questa operazione sui numeri interi ci ricorda che bisogna fare attenzione poiché non possiamo rappresentare valori decimali. nt x = 7; int y = 3; int z;

Page 62: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

z = x / y; // z vale 2, cioè la parte intera della divisione tra 7 e 3 Float e double I tipi float e double sono i cosiddetti numeri in virgola mobile, che rappresentano l’insieme dei numeri reali: con essi possiamo rappresentare numeri molto piccoli o numeri molto grandi, positivi e negativi e naturalmente con e senza decimali. La differenza tra i due sta nel numero di bit riservati alla rappresentazione dei numeri, che si va a riflettere sul range di numeri e sul numero di cifre dopo la virgola che possiamo memorizzare. Quindi se abbiamo bisogno di particolare accuratezza, utilizziamo il tipo double. Vediamo un semplice pezzo di codice in cui riproponiamo la divisione utilizzando double, per mostrare la differenza con il tipo int: double x = 7.0; double y = 2.0; double z; z = x / y; // z vale 3.5 La notazione usata per rappresentare la virgola è quella inglese, in cui si usa il punto (e non una virgola) per dividere la parte intera da quelle frazionaria. Esempio pratico All’interno del programma di esempio vengono utilizzate molte variabili; ecco alcune dichiarazioni per far capire l’importanza che le variabili ricoprono all’interno del programma. 62 int scelta; // [...] 296 int subscelta; 297 int i=1; 298 int n=1; // [...] 367 int subscelta; 368 int i=1; 369 int n=1; // [...] 469 int index=0; // inizializza l'indice // [...] 554 int i = 0; // [...] 576 char invio;

Page 63: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Numeri con segno e senza segno In termini di rappresentabilità c’è da far notare che l’uso dei bit per rappresentare un determinato tipo varia a seconda che quel tipo sia signed (con segno) o unsigned (senza segno). Per rappresentare un numero come 114, ad esempio, sono sufficienti 7 bit, se pensiamo al tipo signed char, che ha 8 bit, possiamo immaginare come l’ottavo bit (il più significativo, quello più a sinistra) rappresenti il segno del numero (‘+‘ se il bit vale 0, ‘-‘ se il bit vale 1).

(0)1110010 // rappresenta, in binario, l'intero 114 (1)0001110 // ecco l'intero -114

Come si vede, oltre a trovare “acceso” il bit più significativo, vediamo che la codifica dei numeri negativi è invertita, parte dal numero -1 (rappresentato con 11111111) e arriva a -128 (10000000). Questa codifica si chiama complemento a due. La stessa codifica con unsigned char, rappresenta valori positivi ma diversi tra loro:

(0)1110010 // rappresenta, in bit, l'intero 114 (1)0001110 // rappresenta, in bit, l'intero 142

In definitiva, ammesso di avere n bit per rappresentare un numero, se è signed, allora i valori possibili saranno compresi tra -2(n-1) e 2(n-1)-1, quindi, nel caso di una rappresentazione ad 8 bit si avrebbero valori compresi tra -128 e 127. Nel caso di un unsigned, invece i valori, come già detto, sono tutti positivi e possono assumere valori compresi tra 0 e 2n – 1, nel caso degli 8 bit si avrebbero valori compresi tra 0 e 255. Gli Operatori: introduzione Gli operatori in programmazione permettono di estrapolare un determinato valore dal frutto dell’operazione che si compie su una o più variabili all’interno del programma; così come l’operatore “+” serve per sommare due numeri in matematica, analogamente serve per compiere la stessa operazione in un programma scritto in C. Ovviamente ci sono delle dovute differenze, innanzitutto le operazioni del C sono quelle basilari (per funzioni più avanzate dobbiamo usare delle librerie apposite), hanno un risultato “finito”, contrariamente a quelle matematiche che possono avere un risultato simbolico o infinito e, infine, contrariamente a quelle matematiche, si possono applicare anche a valori non numerici delle variabili. Gli operatori che andremo ad analizzare nelle seguenti lezioni si suddividono in:

Page 64: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

• Operatori aritmetici. Comprendono somma, sottrazione, moltiplicazione, divisione intera, divisione con modulo ecc.

• Operatori di confronto. Operatori che permettono di verificare determinate condizioni, come ad esempio l’uguaglianza o la disuguaglianza.

• Operatori logici. Da utilizzare con le istruzioni condizionali ed iterative. Per comprendere meglio gli operatori di confronto e logici è consigliabile e propedeutico leggere l'”Introduzione alla logica e diagrammi di flusso”. Proprietà degli operatori Gli operatori hanno diverse caratteristiche e regole che permettono a noi di scriverli correttamente, e al compilatore di capire come utilizzarli. Questo accade perché se non fossero specificate delle regole precise, il compilatore che agisce in modo automatico (ed automatizzato) non saprebbe come interpretare quello che è stato scritto. Visto che non può “fare di testa sua”, dobbiamo essere noi a conoscere le regole seguite nella sintassi del linguaggio e presentare, quindi, quello che vogliamo fare in una forma traducibile e sensata per il compilatore. Le proprietà da conoscere sono poche e non è nemmeno necessario ricordarsele esattamente, basta seguire le convenzioni e, con il tempo, si vedrà che diventerà naturale scrivere programmi “sintatticamente” corretti. Esse sono: Posizione – Un qualsiasi operatore ha una determinata posizione rispetto ad i suoi operandi. Si dice che un operatore è prefisso se compare prima degli operandi, postfisso se compare dopo e infisso se compare tra gli operandi; Arietà – Questa rappresenta il numero di argomenti che un operatore può accettare. Ad esempio l’operatore ++ ha arietà uguale a uno (A++), il simbolo + ha arietà uguale a due (A + B), mentre l’unico operatore ad avere arietà uguale a tre è l’operatore ternario ” ? : ” (A ? B : C), di cui parleremo nella lezione 8; Precedenza (o priorità) – La precedenza è un valore che identifica gli operatori più importanti e quelli meno importanti; maggiore è la priorità minore è il valore che la identifica: questi valori risultano utili, ad esempio, quando si eseguono delle operazioni matematiche, per stabilire quali operazioni debbano essere eseguite per prime, questo, ovviamente, in mancanza di parentesi tonde che potrebbero modificare l’ordine con cui si eseguono le operazioni sulle variabili (in realtà ciò accade semplicemente perché le parentesi tonde hanno una priorità maggiore); Associatività – L’associatività stabilisce, a parità di priorità, quale sia l’ordine con cui bisogna eseguire i vari operatori. Se l’operatore è associativo a sinistra, si scorrerà da sinistra verso destra, mentre se è associativo a destra, si farà l’esatto contrario.

Page 65: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Esempi tipici in cui intervengono le proprietà degli operatori, si hanno nell’interpretazione di formule matematiche, come nell’esempio seguente: a + b * c /* che viene interpretato come * a + (b * c), e non (a + b) * c * perchè la moltiplicazione ha * precedenza maggiore */ a – b – c /* che viene interpretato come * (a – b) – c , perchè l’associatività * della sottrazione è a sinistra */

Esempio pratico Gli operatori matematici non vengono usati moltissimo nel programma; vengono, al contrario, usati molti operatori di confronto. Questo dipende esclusivamente dal fatto che il programma lavora prevalentemente con il testo e non con i numeri. Ecco un estratto di codice che mostra vari confronti:

396 if (subscelta < i) 397 { // IF – OPEN 398 399 // Se la lista èvuota esco 400 if(p == NULL) 401 return; 402 403 // Se la lista ha almeno due elmenti… 404 if(p->pun != NULL)

Page 66: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

CONTROLLI Controlli condizionali: If-Else Nella programmazione, come già detto, le istruzioni vengono eseguite dalla prima fino all’ultima. Per deviare il flusso delle scelte (ad esempio per scegliere tra l’opzione A e l’opzione B) basta porre delle condizioni che, se verificate, eseguono un pezzo di codice o altrimenti ne eseguono un altro; queste istruzioni particolari che permettono di incanalare il flusso si chiamano strutture di controllo condizionale o, più genericamente, istruzioni condizionali. Esistono due tipi di strutture di controllo condizionale, l’if-else e lo switch. L’if-else e lo switch hanno, sostanzialmente, comportamenti simili, ed anche se il primo è largamente il più usato, hanno delle differenze per quanto riguarda il tipo di operazione che vogliamo svolgere; ma vediamo nel dettaglio come funzionano. Nota: in C, a differenza del C++ e del Java, non esiste il tipo booleano (che può assumere valore vero -true- o falso -false-), per questo quando deve essere verificata una condizione essa risulta falsa se vale zero e vera altrimenti. If-Else L’istruzione if permette di verificare determinate condizioni ed ha la seguente sintassi:

[… altre istruzioni …] if (espressione) istruzione [… altre istruzioni …] In questo caso se l’espressione risulta vera, fa eseguire l’istruzione immediatamente successiva, altrimenti (se la condizione è falsa) si salta l’istruzione (od il blocco di istruzioni) facenti parti dell’if e si procede nell’esecuzione delle istruzioni successive, che possono essere la prosecuzione del programma o un semplice else, ad indicare la possibile alternativa all’if: if (espressione) istruzione1 else istruzione2 o un else if che permette di verificare una o più condizioni:

Page 67: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

if (espressione) istruzione1 else if (espressione) istruzione2 else istruzione3 Così si può comandare il flusso del programma decidendo di eseguire una parte di codice oppure no (nel caso del solo if), di fare una scelta tra due parti di codice (nel caso if – else) o di fare una scelta tra più parti di codice (nel caso if – else if – else). Facciamo un esempio pratico nel codice sottostante, assumendo che sia stato definito, nel codice soprastante all’if, il valore della variabile intera “risultato_esame”, che può assumere un valore compreso tra 0 e 30: if (risultato_esame >=18) printf (“Complimenti hai superato l’esame”); else if (risultato_esame >=15) printf (“Devi sostenere l’orale per questo esame”); else printf (“Non hai superato l’esame”); Generalmente dopo un if o un else viene eseguita solo la prima istruzione più vicina, regola che può creare dei problemi quando ci sono due o più istruzioni, ma alla quale si può porre rimedio ponendo tutte le istruzioni tra due parentesi graffe, la graffa di apertura ( { ) andrà sotto all’if, allineata con la prima lettera, mentre la graffa di chiusura ( } ) andrà posta dopo l’ultima istruzione, su una nuova riga ed allineata con quella di apertura. Per chiarire meglio, ecco un if-else abbastanza semplice che spiega come utilizzare le parentesi graffe per raccogliere istruzioni: if (risultato_esame >=18) { printf (“Complimenti hai superato l’esame”); int passato = 1; } else { printf (“Non hai superato l’esame”); int passato = 0; } Dobbiamo fare particolare attenzione all’uso dei blocchi if annidati, come quello dell’esempio: if (risultato_esame < 18)

Page 68: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

if (risultato_esame &lt 15) printf (“Non hai superato l’esame”); else printf (“Sei stato ammesso all’orale”); In questo caso risulta difficile capire esattamente quale sia il significato reale di questo else, e soprattutto ci si potrebbe domandare se realmente il programmatore abbia voluto porre determinate condizioni o se abbia semplicemente sbagliato a strutturare il costrutto if. Se non capiamo esattamente il codice, conviene ricordarsi la regola secondo la quale “l’else si riferisce sempre all’if più vicino, a meno che non sia diversamente specificato da eventuali parentesi graffe”, ma è comunque buona norma usare sempre le parentesi graffe anche quando si tratta di eseguire una sola istruzione, magari indentando (mettendo opportune spaziature) correttamente il codice. L’esempio precedente risulta sicuramente più chiaro se strutturato in questo modo: if (risultato_esame < 18) { if (risultato_esame < 15) { printf (“Non hai superato l’esame”); } else { printf (“Sei stato ammesso all’orale”); } } Controlli condizionali: Switch e operatori ternari Operatore Ternario L’operatore ternario “? :” è una forma sintetica dell’istruzione if-else, e per questo viene usata per ragioni di comodità e sinteticità del codice. L’operatore “? :” è l’unico operatore ternario del C, infatti opera su tre parametri a differenza degli altri operatori che spesso operano su uno o due parametri. Di seguito presentiamo la sintassi dell’operatore e la corrispondente sintassi di un blocco if-else: // Operatore ternario ? espressione1 ? espressione2 : espressione3 // Corrispondente blocco if-else if (espressione1) { espressione2; } else { espressione3; }

Page 69: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Quindi se l’espressione1 risulta vera, si esegue l’espressione2, altrimenti si esegue l’espressione3. Per esempio il seguente codice assegna, nelle due forme equivalenti, alla variabile “max” il massimo tra “alfa” e “beta”: if (alfa > beta) max = alfa; else max = beta; // che corrisponde a… max = (alfa > beta) ? alfa : beta; Switch Come annunciato, l’istruzione switch ha delle differenze dall’if-else, infatti può essere usata solo in alcuni casi dove:

• Viene valutata solamente una variabile, tutte le scelte dipenderanno, infatti, da questa variabile. La variabile deve essere un tipo int, shor, long o char;

• Ogni singolo valore della variabile può controllare solo una scelta. Una scelta finale, chiamata default è incaricata di catturare tutti i valori dei casi non specificati;

L’istruzione switch ha la seguente struttura: switch (espressione) { case elem1: istruzione1; break; opt case elem2: istruzione2; break; opt case elemn: istruzionen; break; opt default: istruzione; break; opt }

Page 70: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Notiamo che lo switch ha, inoltre, una struttura abbastanza particolare, è a cascata, cioè se eseguo il primo caso (avendo sotto degli altri) e non metto un break per uscire, continua ad eseguire anche le istruzioni successive che fanno parte di altre casistiche; questa struttura ricorda molto quella adottata nei file batch (.bat) utilizzati con il DOS e permette di ottenere effetti interessanti sulla selezione del codice, risparmiandone quando è comune a più casistiche. Ma vediamo l’esempio pratico, assumendo di avere la variabile intera “numero” che può assumere valori maggiori od uguali a zero. switch (numero) { case 0: printf(“Nessuno”); break; case 1: printf(“Uno”); break; case 2: printf(“Due”); break; case 3: case 4: case 5: printf(“Valore positivo piccolo”); break; default: printf(“Valore positivo grande”); break; } Esempio Pratico L’IF, all’interno del programma, viene usato in larga misura; ad esempio, per avviare le scelte adeguate del menu si utilizza una serie di IF-ELSE: 101 else if (scelta == 1) // Visualizzo i contatti presenti 102 { // ELSEIF 1 – OPEN 103 104 visualizzaContatto(lista); 105 106 } // ELSEIF 1 – CLOSE 107 else if (scelta == 2) // Aggiungo un nuovo contatto 108 { // ELSEIF 2 – OPEN 109 110 lista = aggiungiContatto(lista);

Page 71: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

111 112 } // ELSEIF 2 – CLOSE Controlli Iterativi: while, for, break Le istruzioni di ciclo sono una delle componenti fondamentali della programmazione e permettono di risparmiare la quantità di codice scritta rendendo quindi il programma più leggero e più facile da comprendere. Le istruzioni di ciclo, come le istruzioni condizionali, hanno bisogno che alcune condizioni vengano verificate affinché il ciclo continui nella sua opera o si interrompa. Le istruzioni di ciclo del C sono tre:

• il while, che continua il suo ciclo fino a quando l’espressione associata non risulta falsa

• il do-while, che agisce come il while, ma assicura l’esecuzione delle istruzioni associate almeno una volta

• il for, che è il costrutto più usato, versatile e potente tra i tre, ma che proprio per questo è quello a cui bisogna prestare un po’ più di attenzione.

Come per le istruzioni condizionali, quando parliamo di “istruzione” ci riferiamo ad una o più istruzioni associate, ricordando che se le istruzioni sono due o più bisogna usare le parentesi graffe per delimitarle, mentre una singola istruzione non ne ha necessariamente bisogno. While La struttura del while è la seguente: while (condizione) istruzione/i Generalmente l’istruzione o le istruzioni all’interno del while agiscono sulla condizione che il while aspetta essere falsa per poter uscire dal ciclo, questo perché altrimenti il ciclo non terminerebbe. Ad esempio per stampare a video una successione di cifre da 0 a 99, proponiamo il codice seguente: int i = 0; while (i != 100) { printf("%d n", i); i++; }

Page 72: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Affinché il while possa verificare la condizione associata, è necessario aver dichiarato la variabile prima del while, questo, come nell’esempio, può essere fatto nella riga soprastante o in un altra parte del programma. Do – While Molto simile al while è il do-while che ha la seguente struttura: do istruzione/i while (condizione) Tenendo valide tutte le considerazioni fatte per il while, va notato che in questo modo si esegue l’istruzione all’interno del do-while almeno una volta, indipendentemente dal fatto che la condizione associata al while risulti vera o falsa. L’esempio seguente mostra come sia possibile utilizzare il do-while, ad esempio, per porre una domanda all’utente e continuare nell’esecuzione solo se l’utente risponde correttamente, oppure ripetere la domanda: do { printf("Premere 1 per continuare : "); scanf("%d", & valore); printf("n"); } while (valore !=1)

For Prima di spiegare le caratteristiche del for, ne proponiamo la struttura generale: for (inizializzazione ; condizione ; incremento) istruzione/i che equivale alla rappresentazione con un while con la seguente struttura: inizializzazione while (condizione) istruzione/i incremento Il for, quindi, potrebbe tranquillamente essere sostituito da un while, se non fosse che è più conciso ed è concettualmente usato quando sappiamo a priori il numero di

Page 73: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

iterazioni che vogliamo fare. I parametri all’interno del for hanno diversi compiti, e sono separati da un punto e virgola:

• Il primo viene eseguito prima di entrare nel ciclo, ed inizializza una variabile, generalmente la variabile è usata come variabile di controllo del ciclo, in poche parole servirà per tenere traccia del numero di iterazioni del ciclo; a differenza del C++, dove la dichiarazione può essere fatta contemporaneamente all’inizializzazione, nel C, in questo costrutto, la variabile deve essere dichiarata fuori, prima del for;

• Il secondo è la condizione (che coinvolge anche la variabile di controllo), che se risulta falsa interrompe l’esecuzione del ciclo;

• Il terzo parametro è l’istruzione di incremento, che viene eseguita dopo ogni ciclo del for; questa istruzione agisce generalmente sulla variabile di controllo incrementandone (o decrementandone) il valore.

Per chiarire meglio l’uso del for presentiamo un semplice codice che conta da zero a cento, stampando a video la variabile di controllo: int i; for (i=0; i<=100; i++) printf("%d n", i); Ognuna delle tre istruzioni all’interno del for può essere omessa, con il risultato di condizionare il ciclo, o non modificando la variabile, o facendo essere sempre vera la “condizione” del for; in questo ambito bisogna citare un uso particolare del ciclo for, che è quello del cosiddetto “ciclo for infinito”. Un ciclo che non termina, abbiamo detto precedentemente, è da considerarsi errore, ma esiste una situazione in cui vogliamo, invece, ciclare all’infinito fino a quando l’utente non decide di interrompere volontariamente il programma, ad esempio avendo un menu generale che ogni volta deve presentarsi sullo schermo. Il for utilizzato in questo caso ha una struttura particolarissima, ovvero non ha nessuno dei tre parametri sopra esposti, ma contiene solamente due caratteri punto e virgola: main () { for ( ; ; ) { printf ("premi CtrL+Z per interromperen"); } } è anche possibile utilizzare all’interno delle tre istruzioni, più di una variabile di controllo, in modo da avere un ciclo dinamico; un esempio può essere quello di due variabili, “high” e “low” che convergono:

Page 74: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

int high; int low; for (high=100, low=0; high >= low; high--, low++) printf("H=%d - L=%d n", high, low); Break e Continue Abbiamo già usato l’istruzione break quando stavamo parlando dello switch, senza addentrarci nel dettaglio, adesso, invece, conviene spiegare le caratteristiche del break e di un’altra istruzione, continue:

• break – esce dal ciclo o dallo switch; • continue – salta una iterazione del ciclo senza interromperlo;

Per capire la sottile, quanto importante, differenza tra le due istruzioni, presentiamo un semplice codice in cui si legge un numero da tastiera che volgiamo sia compreso tra 0 e 100, se tale valore risulta essere negativo, si esce dal ciclo, mentre se è maggiore di cento si richiede di inserire un valore valido; se il valore è tra 1 e 100, si stampa a video il suo quadrato, se è zero si esce: int valore; while (scanf("%d", &valore) == 1 && valore != 0) { if (valore < 0) { printf("Valore non consentiton"); break; /* esce dal ciclo */ } if (valore > 100) { printf("Valore non consentiton"); continue; } int quadrato = valore * valore; printf("%d n", quadrato); } Esempio pratico

Page 75: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

Anche i cicli FOR ed i cicli WHILE vengono usati largamente all’interno del programma. Servono soprattutto per scorrere gli elementi, ad esempio, per salvarli o stamparli a video. Mostriamo di seguito due esempi: 186 while (p != NULL) 187 { // WHILE – OPEN 188 189 /* 190 * Stampo gli altri contatti 191 */ 192 system(pulisci); // PULISCE LO SCHERMO 193 printf (” #######################n”); 194 printf (” # RUBRICA EASY v1.0 #n”); 195 printf (” #######################n”); 196 printf (” # VISUALIZZA CONTATTO #n”); 197 printf (” #######################nn”); 198 printf (” NOME > %sn”, p->inf.nome); 199 printf (” COGNOME > %sn”, p->inf.cognome); 200 printf (” TELEFONO > %sn”, p->inf.telefono); 201 printf (” EMAIL > %sn”, p->inf.email); 202 printf (” SITOWEB > %sn”, p->inf.sitoweb); 203 pausa(); 204 // Leggo l’elemento successivo 205 p = p->pun; 206 207 } // WHILE – CLOSE [Modifica una serie di elementi] 326 for (n=1; n<i; n++) 327 { // FOR – OPEN 328 329 /* 330 * trovato l’elemento modifico l’informazione dentro di esso 331 */ 332 if (subscelta == n) 333 { // IF – OPEN 334 335 // Popolo la variabile daInserire 336 printf (” NOME [%s] > “, p->inf.nome); 337 scanf (“%s”, p->inf.nome); 338 printf (” COGNOME [%s] > “, p->inf.cognome); 339 scanf (“%s”, p->inf.cognome); 340 printf (” TELEFONO [%s] > “, p->inf.telefono);

Page 76: V anno TPSI - Nuove Scuole S.r.l. · sovietico (messo in orbita il 4 ottobre 1957) gli USA da una parte lanciarono un programma spaziale che doveva portare l'uomo sulla luna, mentre

341 scanf (“%s”, p->inf.telefono); 342 printf (” EMAIL [%s] > “, p->inf.email); 343 scanf (“%s”, p->inf.email); 344 printf (” SITOWEB [%s] > “, p->inf.sitoweb); 345 scanf (“%s”, p->inf.sitoweb); 346 347 } // IF – CLOSE 348 349 p = p->pun; 350 351 } // FOR – CLOSE