Agli albori di Intenet, la rete veniva usata da scienziati, ingegneri, fisici e bibliotecari. Non c'era nulla di user-friendly nella rete. Non c'erano personal computer all'epoca, ma solo mastodontici mainframe, e chiunque la usasse, doveva imparare un complicato insieme di comandi specifici per ogni sistema. Così nell'Università dello UTAH, che aveva a disposizione un DEC PDP-10, non potevano facilmente trasferire dati nella UCSB che aveva un sistema completamente diverso, un IBM 360/75. Fu subito chiaro che per trasferire files da un sistema ad un altro, un insieme condiviso (standard) di comandi (cioè un protocollo) era necessario.
La prima versione di FTP è stata descritta da A. Bhushan dell'MIT il 16 aprile 1971 nella RFC 114. Le ultime versioni sono dovute a Postel e Reynolds.
Definito nell'RFC 959 il protocollo FTP è di tipo client - server e consente, in modo efficente e affidabile, di scaricare file da un server o di caricarli, di organizzare il proprio spazio su disco nel server.
E' stato il programma di più largo uso, visto che il suo antenato CPYNET è stato usato anche per la prima versione della
posta elettronica.
La struttura del server è la seguente, come riportato nella RFC 959:
Ci sono alcune sigle da definire nello schema sopra (avvertenza: userò lo sfondo grigio per le parti che riguardano il server, per maggiore chiarezza):
Altra nota: mi sono ostinato a chiamare CLIENT ciò che nella RFC 959 viene chiamato USER.
C'è innanzitutto da notare che il protocollo lavora su due livelli; un livello per scambiare i comandi e uno per scambiare dati. Dal lato utente esiste anche il livello utente che è costituito da un'interfaccia (testo o GUI) per permettere all'utente di dare i comandi al sistema.
Il client inizializza la connessione di controllo: a questo livello il protocollo funziona come il Telnet. All'inizializzazione dell'utente, il client PI genera dei comandi verso il server lungo la linea di controllo e il server risponde con dei reply.
I comandi FTP (sempre da client a server) specificano:
A questo punto il client si mette in ascolto sulla porta dati standard e attende che il server inizi la connessione e il trasferimento dei dati. Quando il trasferimento è terminato (viene ricevuto un EOF - EndOfFile) è compito del client chiudere la connessione dati.
Se invece viene usata la modialità passiva, il server decide quale sarà la porta dati e si metterà lui (e non il client) in ascolto su quella porta, in attesa che il client inizi la transazione.
Risulta alquanto istruttivo analizzare il log di una connessione reale:
connecting to 216.63.199.1:21 Connected to 216.63.199.1 port 21 220 ns1.provider.it FTP server (Version wu-2.6.2-8) ready. USER pippo 331 Password required for pippo. PASS (hidden) 230 User pippo logged in. Access restrictions apply. PWD 257 "/" is current directory. SYST 215 UNIX Type: L8 Host type (S): UNIX (standard) PASV 227 Entering Passive Mode (216,63,199,1,252,141) connecting to 216.63.199.1:64653 - - connecting to 216.63.199.1:64653 Connected to 216.63.199.1 port 64653 LIST 150 Opening ASCII mode data connection for directory listing. Received 6060 bytes in 0.2 secs, (368.75 Kbps), transfer succeeded 226 Transfer complete.
Analizziamo riga per riga il log:
connecting to 216.63.199.1:21
Il client inizializza la connessione connettendosi all'IP del server (ritornato ad esempio da un DNS o dal file /etc/hosts del client)
sulla porta comandi 21 (L=21)
Connected to 216.63.199.1 port 21
TCP/IP risponde dicendo che la connessione sulla porta prestabilita è correttamente avvenuta.
sulla porta comandi 21 (L=21)
220 ns1.provider.it FTP server (Version wu-2.6.2-8) ready.
Il server invia una reply (sempre nella forma codice - descrizione) dicendo che il protocollo è pronto a ricevere comandi (codice 220)
USER pippo
Il client invia il comando USER al server specificando il nome dell'utente "pippo".
sulla porta comandi 21 (L=21)
331 Password required for pippo.
Il server invita il client a fornire la password di pippo (codice 331).
PASS (hidden)
Il client invia la password che viene nascosta nel log (NB ma passa in chiaro sulla linea dei comandi, a meno che non vi sia SSL)
230 User pippo logged in. Access restrictions apply.
Il server risponde con il codice 230 dicendo che l'utente è ora collegato e che vengono applicate restrizioni di accesso (ad esempio l'utente pippo può leggere e scrivere solo nella sua home directory e comandi di navigazione della directory al di fuori di questa saranno ignorati)
PWD
Il client invia il comando di PrintWorkDirectory che invita il server a ritornargli il nome della directory attuale nel filesystem del server (la home in questo caso)
257 "/" is current directory.
il server risponde con il codice 257 aggiungendo il nome della directory attuale di lavoro nel filesystem del server.
SYST
Qui il client vuole sapere che sistema operativo c'è dall'altra parte
215 UNIX Type: L8
Il server informa che sta girando in un sistema operativo UNIX. Il nome di sistema ritornato è codificato nella
RFC 943 ed è un nome registrato dallo IANA.
Host type (S): UNIX (standard)
Il client aggiunge una riga di commento sul sistema operativo del server.
PASV
Il client impone al server di utilizzare la modalità passiva: ciò abilita il srever a decidere la porta dati che non sarà più la 20 ma una porta non privilegiata, cioè > 1024. (Le porte privilegiate sono definite nella RFC 943).
227 Entering Passive Mode (217,64,198,227,252,141)
Il server ritorna al client una sestina (h1,h2,h3,h4,p1,p2), in cui i primi quattro numeri sono i componenti dell'IP del server, e gli ultimi due (generati casualmente) individuano la porta in cui sarà iniziata la connessione dati: 252|141= 1111110010001101 = 64653.
NB: la porta dati viene ricalcolata ad ogni trasferimento dati, non è costante per tutta la sessione di collegamento.
connecting to 217.64.198.227:64653 - - connecting to 217.64.198.227:64653
viene iniziata la connessione sulla porta 64653 dal client; il numero di porta che è stato comunicato sulla linea comandi dal server nel passaggio precedente.
Connected to 217.64.198.227 port 64653
TCP/IP riosponde quando la connessione verso il server sulla porta dati è stabilita.
LIST
Il client inoltra il primo comando di file stsyem, equivalente all'ls di UNIX o al DIR del DOS o del Telnet.
Notare che il risultato di LIST è un traffico sulla linea dati visto che viene inviato un file con il contenuto della directory
(NB nel logo vedo solo ciò che passa sulla linea comandi).
150 Opening ASCII mode data connection for directory listing.
Il server risponde con il codice 150 perché ora che la connessione dati è pronta può iniziare il trasferimento dei dati.
La modalità di trasferimento è di tipo ASCII ma può essre cambiata a BIN inviando al server il comando MODE BIN. Usando il trasferimento ASCII i caratteri di a capo verranno trasformati a seconda che il client sia UNIX (in questo caso non viene fatto nulla) o Windows (in questo caso il carattere di "a capo" \lf viene sostituito con la sequenza \cr\lf).
Received 6060 bytes in 0.2 secs, (368.75 Kbps), transfer succeeded
Il client notifica che la trasmissione ha avuto luogo e indica anche il numero di bytes ricevuti, il tempo impiegato, la velocità media di trasmissione e il messaggio di completamento (all'arrivo dell EOF)
226 Transfer complete.
Il server conclude con il codice 226 stabilendo che la trasmissione è terminata.