Creare il proprio proxy

download Creare il proprio proxy

of 7

Transcript of Creare il proprio proxy

  • 8/3/2019 Creare il proprio proxy

    1/7

    CP pensareprogettareprogrammare n. 134 aprile 2004

    Creare il proprio proxydi Cesare Zavalloni

    Un piccolo e semplice proxy in Java per gestire meglio la propria rete e imparare la pro-grammazione concorrente

    Cesare Zavalloni

    Giornalista, e iscritto alquarto anno del Cor-so di Laurea in Scien-ze dellInformazionedi Cesena.

  • 8/3/2019 Creare il proprio proxy

    2/7

    pubblicato suWWW.INFOMEDIA.IT

    stampa digitale da

    Lulu Enterprises Inc.

    stores.lulu.com/infomedia

    Infomediamedia e limpresa editoriale che da quasi venti an-

    a raccolto la voce dei programmatori, dei sistemi-

    dei professionisti, degli studenti, dei ricercatori e dei

    essori dinformatica italiani.

    o piu di 800 gli autori che hanno realizzato per le te-

    Computer Programming, Dev, Login, Visual Basic

    nal e Java Journal, molte migliaia di articoli tecnici,

    entazioni di prodotti, tecnologie, protocolli, strumen-lavoro, tecniche di sviluppo e semplici trucchi e stra-

    mmi. Oltre 6 milioni di copie distribuite, trentamila

    ne stampate, fanno di questa impresa la piu grande ed

    ente realta delleditoria specializzata nel campo della

    rammazione e della sistemistica.

    tti questi anni le riviste Infomedia hanno vissuto del-

    assione di quanti vedono nella programmazione non

    la propria professione ma unattivita vitale e un vero

    rtimento.

    2009, Infomedia e cambiata radicalmente adottando

    uovo modello aziendale ed editoriale e si e organiz-

    attorno ad una idea di Impresa Sociale di Comunita,

    ecipata da programmatori e sistemisti, separando le

    ita di gestione dellinformazione gestite da un board

    unitario professionale e quelle di produzione gesti-

    a una impresa strumentale. Questo assetto e in linea

    le migliori esperienze internazionali e rende Infome-

    ancora di piu parte della Comunita nazionale degli

    uppatori di software.

    media e media-partner di manifestazioni ed eventi in

    ito informatico, collabora con molti dei pi u impor-

    editori informatici italiani come partner editoriale e

    itore di servizi di localizzazione in italiano di testi in

    ua inglese.

    aginazione automatica di questa rivista e realizzata al

    % con strumenti Open Source usando OpenOffice,

    cs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp,

    hon e BASH

    copyright information about the contents of Compu-

    Programming, please see the section Copyright at

    end of each article if exists, otherwise ask authors.media contents is 2004 Infomedia and released as

    ative Commons 2.5 BY-NC-ND. Turing Club content

    2004 Turing Club released as Creative Commons

    BY-ND.

    nformazioni di copyright sul contenuto di Computer

    gramming sono riportate nella sezione Copyright

    fine di ciascun articolo o vanno richieste direttamen-

    gli autori. Il contenuto Infomedia e 2004 Infome-

    e rilasciato con Licenza Creative Commons 2.5 BY-

    ND. Il contenuto Turing Club e 2004 Turing Club

    asciato con Licenza Creative Commons 2.5 BY-ND.

    pplicano tuttele normedi tuteladeimarchie deisegni

    ntivi.

    ogni caso ammessa la riproduzione parziale o tota-

    ei testi e delle immagini per scopo didattico purche

    gano integralmente citati gli autori e la completa

    tificazione della testata.

    oscritti e foto originali, anche se non pubblicati, non

    stituiscono.

    tenuto pubblicitario inferiore al 45%.

    biografia dellautore riportata nellarticolo e sul

    www.infomedia.it e di norma quella disponibi-

    nella stampa dellarticolo o aggiornata a cu-

    dellautore stesso. Per aggiornarla scrivere a

    @infomedia.it o farlo in autonomia allindirizzo

    //mags.programmers.net/moduli/biografia

    http://www.infomedia.it/http://stores.lulu.com/infomediahttp://stores.lulu.com/infomediahttp://stores.lulu.com/infomediahttp://stores.lulu.com/infomediahttp://www.infomedia.it/
  • 8/3/2019 Creare il proprio proxy

    3/7

    Computer Programming n.134 - Aprile 2004 59

    PROGRAMMING

    In tempi in cui hacker (o meglio cracker) e virus occu-pano giornali e telegiornali, la sicurezza diviene unproblema non pi circoscritto alla tutela dei segreti dienti ed aziende ma anche, sotto forma di tutela della

    privacy, una componente indispensabile di ogni rete, assie-me alla capacit di rispondere prontamente alle richiestedegli utenti. I proxy, polivalenti e multifunzionali, si collo-

    cano dunque come partner ideali di ogni amministratore,dotati della flessibilit necessaria per essere agevolmenteprogrammati, ma anche inflessibili quando occorra.

    Obiettivi e contestoI proxy sono applicativi che operano in modo quasi tra-

    sparente allinterno di un dominio, gestendo il traffico inentrata e in uscita, ed effettuando un controllo su di esso.Le necessit che portano alladozione di un proxy possonoessere riassunte nelle seguenti:

    consentire o impedire laccesso alla rete, in ingresso oin uscita, a determinate macchine (indirizzi);

    monitorare il traffico in ingresso o in uscita per stori-cizzazioni (logging);

    nascondere gli IP delle macchine locali su Internet; servizio di caching.

    Nel corso dellarticolo vedremo:

    il meccanismo attraverso cui stabilita una connessio-ne TCP;

    i principali scenari operativi di un proxy o di un siste-ma proxy-firewall;

    un proxy minimale concorrente in linguaggio Java confunzionalit di base.

    Alcune conoscenze pregresse saranno necessarie, in par-ticolare occorrer:

    conoscere i meccanismi di eredit e incapsulamento trale classi Java;

    avere dimestichezza nel maneggiare file in Java; conoscere i meccanismi di funzionamento di una rete

    IP.

    Meccanismi alla base dei proxyIn un tipico contesto dutilizzazione, un proxy esamina le

    richieste in uscita (cio provenienti dalla propria LAN),ne stabilisce lidoneit (attraverso un file o un database di

    configurazione) e respinge o consente linvio della richie-sta (che pu essere un file qualunque oppure un metodoPOST o qualsiasi altro pacchetto inoltrato da uno dei com-puter della LAN). Analogo il suo compito per i pacchet-ti in ingresso. Il nostro applicativo potr essere dotato difunzionalit aggiuntive, tra le quali:

    la gestione di un servizio di monitoraggio del traffico(logging);

    la gestione di un servizio di caching; la gestione di un servizio di firewall.

    Come per quasi tutti gli applicativi, anche per i proxysono due i parametri da massimizzare durante la fase di pro-gettazione: efficienza ed efficacia. Questultima indica lacapacit dellapplicativo di svolgere in modo puntuale epreciso il suo compito, la sua facilit di configurazionesecondo le necessit della rete che difende. Lefficienza invece quel parametro che consente di valutare le presta-zioni del programma: dovr pertanto minimizzare i tempi diattesa e massimizzare i tempi operativi. Appare pertanto

    una naturale conseguenza di questo ragionamento la neces-sit di rendere lapplicativo concorrente, cio costituito dapi thread (processi leggeri).

    Connessioni TCPI proxy possono essere visti come agenti polifunzionali;

    essi operano, infatti, sia come client, sia come server. Peruna macchina che inoltra pacchetti ad un dominio, ilproxy svolge il ruolo di client, ed il primo a ricevere i datiin ingresso. Per una macchina della rete locale (LAN), ilproxy svolge il ruolo di server, poich si occupa dellinviodei dati.

    Lo stato ibrido client/server di un proxy rappresentato inFigura 1.

    Il proxy gestir quindi contemporaneamente due diverseconnessioni TCP: la prima verso il server, la seconda versoil client. Da un punto di vista del modello OSI, il nostrostrato operativo sar dunque il quarto, quello su cui siappoggia il protocollo TCP/IP. Occorre dunque aprire una

    networking

    Creare il proprio proxyUn piccolo e semplice proxy in Java per gestire meglio

    la propria rete e imparare la programmazione concorrente

    di Cesare Zavalloni

    Cesare Zavalloni

    Giornalista, iscritto al quarto anno del Corso di Laurea in ScienzedellInformazione di Cesena.

    [email protected]

    FIGURA 1 Il proxy in un contesto operativo. Si comportacome server verso le macchine della LAN ecome client verso i domini distanti (Internet)

  • 8/3/2019 Creare il proprio proxy

    4/7

    60 Computer Programming n. 134 - Aprile 2004

    networking

    piccola parentesi per valutare una corretta gestione delleporte. Quando il proxy si comporter come client non sarnecessario specificare una porta; invece, nella modalitoperativa server occorre fare una scelta: in linea generalenon ci sono costrizioni, possiamo scegliere la porta che pici aggrada, senza creare conflitti ovviamente, anche se unaconsuetudine la porta 8080, in analogia con la porta 80su cui si scambiano i dati per il protocollo HTTP.

    Il meccanismo attraverso cui stabilita una connessioneTCP il seguente:

    Un server attende una connessione (passive open); Il client invia al server un messaggio di SYN su una

    determinata porta e resta in attesa; Il server risponde di solito con il messaggio ACKalla

    richiesta, decidendo una porta su cui far avvenire lacomunicazione (active open);

    Il client conferma (ACK) la volont di stabilire unaconnessione.

    Ricordiamo che la connessione (socket) bloccante edunque sar necessario specificare nel nostro applicativoun opportuno timeout oltre il quale la connessione sar ter-minata. Chi non avesse dimestichezza con le socket Javapu scoprire che familiarizzare nella gestione di esse e deirelativi buffer piuttosto facile [2].

    Un approccio modulare giunto finalmente il momento di addentrarci specifica-

    tamente nel merito delle scelte implementative del nostroapplicativo. Occorre dunque, per ogni funzionalit cheimplementeremo, stabilire un progetto di massima per averben chiare le idee su cosa deve e non deve fare il nostroproxy.

    La gestione del meccanismo di filtraggio sar operataattraverso due file, denominati in.cfge out.cfgche conter-ranno indirizzi IP preceduti dalla dicituraALLOWoppureDENY. Il file di configurazione in.cfgsi riferisce alle richie-ste provenienti dai domini delle macchine esterne allaLAN e, conseguentemente, il file out.cfg si riferisce alle

    richieste interne alla LAN. Lelencazione dei nomi didominio (o degli IP) allinterno dei singoli file spetterallutente tramite un editor di testo e i domini sarannoordinati dal pi specifico (ad esempio macchina1.domi-nio.com) al meno specifico (ad esempio *.dominio.com).

    La gestione della concorrenza sar dinamica: nuovithread saranno creati o distrutti sulla base dellutilizzo diquelli esistenti. Per far ci il proxy legger da un file di con-figurazione iniziale, chiamato relais.cfg, i seguenti quattroparametri:

    MIN_THREAD, che definisce il numero minimo di

    thread in qualsiasi momento; MAX_THREAD, che definisce il numero massimo dithread;

    MIN_SPARE_THREAD, che definisce il numerominimo di thread inattivi (dormienti);

    MAX_SPARE_THREAD, che definisce il numeromassimo di thread inattivi.

    Perch questa gestione della concorrenza?Ogni singolo thread si occuper della gestione di una

    connessione client/server. Appare evidente che avremobisogno di tanti thread quante saranno le connessioni chevorremo gestire simultaneamente. La creazione di unthread impegna considerevolmente il processore e pertan-

    to non pensabile creare un thread ogni volta che serve.Daltra parte occorre pur porre un limite al numero massi-mo di thread creabili. Infine, siccome anche un thread dor-miente occupa risorse, in presenza di un massiccio numerodi questi sar necessario provvedere alla loro cancellazione.

    La gestione del logging, infine, fornisce un essenzialefeedback allamministratore in quanto permette di control-lare gli eventuali errori prodotti e, nel caso il log sia pro-cessato da un applicativo a finalit statistiche, potr forni-re utili indicazioni sul traffico della nostra rete.

    Modalit di funzionamentoIl nostro proxy sar progettato per essere eseguito su una

    macchina, eventualmente dedicata, e per operare su piporte. Ad ogni porta che utilizzeremo corrisponder unthread che sar creato e avviato solo al momento dellese-cuzione dellapplicativo.

    La classe principale, denominata SProxy si occuperdellanalisi (parsing) dei parametri passati da riga dicomando (shell), controller lesistenza del file di confi-gurazione relais.cfg e ne effettuer il parsing. Infine,avvier un thread per ogni porta sulla quale dovr opera-re il nostro proxy; lelenco delle porte sar anchesso for-nito nel file di configurazione. Le istanze della classeThreadProxy rappresentano appunto questi thread.Possiamo osservare la classe nel Listato 1. Essa crea uni-stanza della classe Proxy (che si occuper delleffettiva

    gestione di tutto il lavoro) e dichiara due variabili locali:port, contenente la porta operativa, eplogcontenente unoggetto PrintWriter: si tratta del buffer per la scrittura delnostro file di log.

    In questo lavoro preliminare non dobbiamo dimenticar-ci di una eventualit: il nostro proxy potrebbe operare die-tro un altro proxy (scenario di pi proxy in cascata). Perrendere compatibile questo scenario con il nostro codice sufficiente permettere allutente, al momento dellavviodel proxy, di specificare due parametri aggiuntivi: lindiriz-zo e la porta del proxy. La presenza di questi parametri sartestimoniata dallattivazione di unflag(isbehind) e dal con-seguente parsing dei parametri.

    Cosa cambier nel funzionamento? Quando una macchi-

    na della LAN effettuer una richiesta al nostro proxy, essonon proceder stabilendo una connessione con il serverrichiesto, ma semplicemente contatter il secondo proxyinviandogli i pacchetti ricevuti tali e quali. Analogamenteoperer in ricezione.

    LISTATO 1 La classe threadproxy: ogni istanza un thread associato a una delle portesulle quali il proxy in esecuzione

    /*** This class implements the services of the Proxy.* It consists of a thread that creates a proxy entity and* initializes it by a given port number and logging file

    */class ThreadProxy implements Runnable {

    int port;PrintWriter plog;ThreadProxy(int port,PrintWriter plog) {

    this.port = port;this.plog = plog;

    }public void run() {

    Proxy p=new Proxy();try {

    p.init(port,plog);} catch (IOException e) {}finally {

    plog.close();}

    }}

  • 8/3/2019 Creare il proprio proxy

    5/7

    Computer Programming n.134 - Aprile 2004 61

    PROGRAMMING

    Monitor, semafori, javamonitorIn un ambiente multithread pi processi (thread) con-

    corrono in mutua esclusione per ottenere laccesso al pro-cessore. Limmediato e plateale vantaggio quello di incre-mentare le prestazioni generali: mentre la CPU attendedati richiesti da un processo (a causa, per esempio, di ope-razioni di I/O), un secondo processo pu sfruttarla per ese-

    guire le proprie istruzioni.Il meno immediato, ma altrettanto plateale svantaggio, rappresentato dallinsorgenza di alcuni fenomeni indeside-rati: race condition, deadlock, starvation. Il primo, ad esem-pio, si verifica quando un secondo processo accede ad una-rea di memoria sulla quale il primo processo stava effet-tuando operazioni e legge dati inconsistenti: proc1 legge10; proc1 calcola (10-1); proc2 legge 10; proc2 calcola(10+1);proc1 scrive 9:proc2 scrive 11.

    In questo scenario lazione diproc1 andata persa.Per evitare questi problemi, ed altri ancor pi gravi, si

    possono utilizzare tre strumenti diversi: monitor, semafori,javamonitor.

    Lasciando le prime due tecniche come approfondimento

    ([3], [6]), nel nostro applicativo utilizzeremo la terza, ijavamonitor, che si realizzano attraverso blocchi o metodidichiarati synchronized ().

    I thread e JavaIn Java abbiamo due differenti modalit per creare un

    thread:

    1) implementare linterfaccia Runnable in una classe, scri-vere il codice per il metodo run() e istanziarne unoggetto; creare un oggetto Thread passando come para-metro un oggetto la cui classe implementa Runnable eapplicarvi il metodo start():

    class Esempio implements Runnable {

    ...

    public void run() {

    ...

    }

    }

    public class Main {

    Thread t = new Thread(new Esempio());

    t.start();

    ...

    }

    2) estendere una classe con la classe Thread e scrivere ilcodice per il metodo run(); istanziarne un oggetto e su

    di esso chiamare subito il metodo start():

    class Esempio extends Thread {

    ...

    public void run() {

    ...

    }

    }

    public class Main {

    Esempio t = new Esempio();

    t.start();

    ...

    }

    Lesecuzione dei thread compito della JVM.Lesecuzione di un thread pu essere terminata semplice-mente uscendo dal metodo run().

    Nel nostro tool la classe contenente i servizi del proxy(classe Proxy) si occuper anche della creazione dei varithread. Allavvio dellapplicativo saranno creati tantithread quanti sono specificati in MIN_SPARE_THREAD.

    Siccome il numero massimo di thread varia in funzionedi quanto specificato nel file relais.cfg non possiamo dareun nome ad oggi oggetto di tipo Thread creato. Pertanto ithread saranno creati, avviati e subito addormentati. Lasuccessiva necessit di gestire una socket comporter ilrisveglio di tutti i thread. Per sapere quale, fra tutti, sarstato svegliato baster includere allinterno dei singolithread un riferimento alloggetto che li ha creati.

    Le classi ThreadProxy e ProxyNel nostro progetto abbiamo scelto di implementare il

    metodo Runnable per la definizione dei thread.La classe ThreadProxy (Listato 1) rappresenta il thread

    in funzione su una porta TCP in cui in esecuzione lap-plicativo. Il suo metodo run() non fa altro che creare uni-stanza della classe Proxy e chiamare il suo metodo init()passando naturalmente la porta usata e il buffer di log.

    La classe Proxy si occupa delle richieste in arrivo e dellagestione del pool di thread. Tra le variabili locali troviamoun socket, un contatore di thread liberi, un metodo per leg-

    gere questo contatore, un metodo per aggiornarlo ed ilmetodo init(). La prima istruzione del metodo stabilireuna passive-open sulla porta. Successivamente creiamo unmonitor e tutti i thread necessari:

    for (i=0;i

  • 8/3/2019 Creare il proprio proxy

    6/7

    62 Computer Programming n. 134 - Aprile 2004

    networking

    Proxy, importante per non perdere il riferimento althread padre, ma per il momento non approfondiamo laspiegazione: sar tutto pi chiaro quando esamineremo laclasse ProxyClient.

    Soffermiamoci invece qualche istante sulla classeRunMonitor (Listato 2). Essa fondamentale non solo peril risveglio dei thread, ma anche perch gestisce una varia-

    bile locale importante: shouldrun. Quando un thread non ciservir pi e vorremo distruggerlo, sar sufficiente modifi-care il valore di questa variabile nel monitor che gli abbia-mo associato. Una semplice verifica del suo stato ci indi-cher se eseguire il thread o terminarlo uscendo dal suometodo run().

    Questa soluzione preferibile a quella che vede impie-gata sul thread da eliminare il metodo destroy(), piuttostoinvasivo e irrispettoso del Garbage Collector, il mecca-nismo attraverso il quale Java elimina dalla memoriaoggetti sui quali non esiste pi alcun riferimento. inte-ressante notare come il Garbage Collector sia anchesso unthread.

    Ora che abbiamo chiari i parametri attuali possiamo pro-

    seguire e vedere come effettuare lactive open:

    for (;;) {

    s=ss.accept(); //active-open

    synchronized(lock) {

    lock.notify();

    }

    synchronized(this) {

    for (;;) {

    try {

    wait();

    } catch (InterruptedException e) {}

    }

    }

    ... //altre istruzioni

    }

    Dopo lactive open, una notifica sulloggetto lock farrisvegliare un thread. Cosa accadr al thread lo scopriremonella classe ProxyClient.

    Successivamente il thread padre sar addormentato inattesa di essere risvegliato a sua volta dal thread. Questo cieviter di proseguire nellesecuzione del codice sottostante,nel quale controlleremo il numero di thread liberi ed even-tualmente ne creeremo o ne cancelleremo alcuni, per poiritornare in attesa di una nuova connessione.

    La chiamata del metodo notify() sulloggetto lock deve

    essere esclusiva, per evitare gli effetti collaterali dellaconcorrenza.

    Le classi ProxyClient e ClientAnche la classe ProxyClient implementa Runnable e rap-

    presenta, in sostanza, il singolo processo leggero relativo aduna connessione (socket).

    Del suo metodo run() analizziamo la parte relativa allaconcorrenza:

    Public void run() {

    try {

    while (!destroy) {

    synchronized(server) {

    server.setfreethreads

    (server.getfreethreads()+1);

    }

    for (;;) {

    try {

    synchronized(lock) {

    lock.wait();

    break;

    }

    } catch (InterruptedException e) {}

    }

    synchronized(server) {

    server.setfreethreads(server.getfreethreads()-1);server.notify();

    }

    if (!lock.run()) break;

    Socket s=server.getSocket();

    ...

    }

    } catch (IOException e) {}

    }

    Il codice meno complicato di come pu sembrare acausa dei vari synchronized. Ricordiamo che il metodo runcomincia lesecuzione da quando i thread sono avviati. Laprima cosa che devono fare, dunque, aumentare il nume-

    ro di thread liberi per poi addormentarsi subito sullogget-to lock (lock.wait()).

    Appena il server notificher sulloggetto lock, uno fraquesti thread si sveglier. Con accesso esclusivo su server (ilthis che giustamente avevamo passato tra i parametri attua-li) esso decrementer il numero di thread liberi e quindinotificher al server, il quale riprender la sua esecuzione.

    Il controllo successivo riguarda la variabile shouldrun dicui abbiamo parlato nel paragrafo precedente: un falsoriscontro comporter luscita dal for (istruzione break) econseguentemente luscita dal metodo run, il che significala morte del thread.

    Nellistruzione successiva comprendiamo invece la veraimportanza di passare this (cio listanza della classe Proxy)tra i parametri attuali: poich loggetto della classe Proxyche effettua lactive open, la socket dovr essere passata althread per poter essere maneggiata, ad esempio appoggian-dovi i buffer necessari allinvio e alla ricezione dei pac-chetti;getSocket() il metodo attraverso il quale le istanzedella classe Proxy permettono di accedere alla loro variabi-le locale socket.

    La classe Client, infine, estende la classe astrattaAbsClient (che fornisce i metodi necessari al filtraggio) erappresenta il comportamento del nostro proxy quandoopera come client, inviando i pacchetti verso lesterno.

    In particolare, dovr differenziare il suo comportamentoa seconda che lapplicativo si trovi dietro un ulteriore

    proxy.Il suo metodo act() stabilisce la connessione verso il ser-ver (o il proxy) e procede allinvio dei dati:

    public void act(String command,OutputStream

    outc,BufferedReader brc) throws IOException {

    String host = Server.parseUrl(command);

    Socket sc;

    sc.setSoTimeout(5000);

    try {

    if (SProxy.isbehind()) {

    sc = new Socket(InetAddress.getByName(SProxy.

    getproxyadd()),SProxy.getproxyport());

    } else {

    sc = new Socket(InetAddress.getByName(host),80);

    }

    } catch (UnknownHostException e) { return; }

    ...

    }

  • 8/3/2019 Creare il proprio proxy

    7/7

    Computer Programming n.134 - Aprile 2004 63

    PROGRAMMING

    In command troviamo lintero comando relativo allarichiesta della macchina locale, come pu essere ad esem-pio una stringa GET http://www.dominio.com/direc-tory1/directory2/nomefile.htm /HTTP1.1.

    Dopo aver stabilito un time-out per la socket, controllia-mo il flag isbehind e, nel caso fossimo dietro un proxy, pro-cediamo alla connessione utilizzando i parametri (indirizzo

    e numero porta) forniti al momento del lancio del nostrotool e accessibili attraverso i metodi statici di SProxy; nelcaso contrario stabiliamo una connessione allhost sullaporta 80 (HTTP).

    Verso una difesa della rete: il firewallUn proxy pu essere dotato anche di sofisticati meccani-

    smi di filtraggio, non solo sulla base dei nomi di dominio,come abbiamo fatto noi, ma anche sulla base delle portealle quali certi pacchetti sono destinati.

    E non solo: anche in base al tipo di porta: TCP o UDP. lo scenario tipico dei proxy che svolgono anche fun-

    zionalit tipiche dei firewall, garantendo cos un ulterioremeccanismo di sicurezza, anche se non infallibile.

    Nel caso di piccole LAN limplementazione dei servizifirewall pu appesantire notevolmente il lavoro del proxy,specialmente se eseguito su macchine poco potenti; in que-sti casi si preferisce allora optare per un software firewalldedicato, magari gratuito ([4]).

    ConclusioniLe conoscenze necessarie per scrivere lo scheletro di un

    proxy non sono, a conti fatti, cos complesse. Al di l

    della semplice gestione dei buffer e delle socket, la partepi difficoltosa rappresentata dalla corretta interpreta-zione delle RFC e dalla scrittura di codice concorrente.Del resto si tratta pur sempre di un tool di importanzacruciale per ogni rete.

    Per chi amasse migliorare ulteriormente il mini proxyche abbiamo presentato in questo articolo, consigliamo

    qualche lettura di largo spettro ([5]).I tool commerciali dispongono inoltre di meccanismi dicaching, in molti casi di prefetching, e possono esseregestiti a distanza con protocollo SSL.

    BIBLIOGRAFIA

    [1] http://www.ietf.org/rfc.html[2] C. Zavalloni, Un SMTP sender tascabile... in 5 minuti,

    Computer Programming n.124[3] Silberschatz e altri, Applied Operating System Concepts,

    Wiley, Capitolo 7.

    [4] http://www.zonelabs.com[5] A. Luotonen, Web Proxy Servers, Prentice Hall[6] C. Milanesi Controllo di elaborazioni Java con un monitor

    attivo, Computer Programming nn. 120-121

    CODICE ALLEGATO

    Proxyftp.infomedia.it

    Come consuetudine, a fine novembre 2003 stata pubblicata laclassifica TOP 500 dei supercomputer pi veloci al mondo, 22edizione, consultabile allindirizzo http://www.top500.org/La classifica viene redatta da un organismo superpartes che utilizza

    un algoritmo di banchmark denominato Linpack per formare la gra-duatoria (in tabella).

    Fatta eccezione per la prima posizione, i TOP 10 sono tutti com-puter installati in America del nord. (segue a pagina 73)

    Rank Sito di installazione Descrizione computer / Numero di processori R max (miliardiNazione/Anno Casa produttrice operazioni/sec.)

    1 Earth Simulator Center Earth Simulator/ 5120 35860Japan/200 NEC

    2 Los Alamos National Laboratory ASCI Q - AlphaServer SC45, 1.25 GHz/ 4096 13880United States/2002 HP

    3 Virginia Tech X- 1100 Dual 2.0 GHz Apple G5/ 2200 10280United States/2003 Self-made

    4 NCSA Tungsten - PowerEdge, P4 Xeon 3.06 GHz/ 2500 9819United States/2003 Dell

    5 Pacific Northwest National Laboratory Mpp2 - Integrity rx2600 Itanium2 1.5 GHz/ 1936 8633United States/2003 HP

    6 Los Alamos National Laboratory Lightning - Opteron 2 GHz, Myrinet/ 2816 8051United States/2003 Linux Networx

    7 Lawrence Livermore National Laboratory MCR - Linux Cluster Xeon 2.4 GHz - Quadrics/ 2304 7634United States/2002 Linux Networx/Quadrics

    8 Lawrence Livermore National Laboratory White - SP Power3 375 MHz/ 8192 7304United States/2000ASCI IBM

    9 NERSC/LBNL Seaborg - SP Power3 375 MHz 16 way/ 6656 7304United States/2002 IBM

    10 Lawrence Livermore National Laboratory xSeries Cluster Xeon 2.4 GHz - Quadrics/ 1920 6586United States/2003 IBM/Quadrics

    In breve

    Top 500: la classifica 2003 dei supercomputerdi Alberto Rosotti