FTP - File Transfer Protocol

Storia

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.

Funzionamento

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:

Struttura del protocollo FTP

Ci sono alcune sigle da definire nello schema sopra (avvertenza: userò lo sfondo grigio per le parti che riguardano il server, per maggiore chiarezza):

Control Connection
il collegamento tra gli strati interpreti del sistema (User protocol Interpreter e Server protocol Interpreter) con i quali il client ed il server si scambiano i comandi FTP. La struttura di questo livello è simile al protocollo Telnet. Si noti che rispetto al protocollo di posta (SMTP ad esempio) qui c'è la necessità di dividere i comandi dai dati.
Data Connection
Collegamento sul quale viaggiano i dati secondo una specifica formattazione (decisa con i comandi MODE e TYPE).
DTP
Nel protocollo FTP esistono sempre due processi di trasferimento (DTP): uno attivo e uno passivo. Quale dei due sia passivo lo stabilisce di volta in volta il client. Il DTP crea le connessioni con il suo equivalente e gestisce il trasferimento dei dati.
Control Port
Il client inizializza sempre la porta della connessione comandi. La porta standard di default stabilita dal client è la porta 21.
Data Port
Il processo passivo sta ad "ascoltare" il processo attivo sulla porta dati per aprire una connessione dati quando il processo attivo è pronto a iniziare la transazione. La porta standard di default stabilita dal server è la porta 20.
PI
Il Protocol Interpreter. I lati client e server del protocollo hanno ruoli differenti implementati degli intepreti lato client e server (Client PI e Server PI)
reply
Segnale di riconoscimento (positivo o negativo) inviato dal server al client in risposta ad un comando FTP. E' formato da un codice seguito da una stringa di descrizione.
server FTP
Un software che comprende gli strati di interpretazione dei comandi (Server PI) e di trasferimento dati (Server DTP).
server-DTP
il data transfer process (processo di trasferimento dati), normalmente nello stato attivo, stabilisce la connessione con la porta dati in ascolto. Imposta i parametri per il trasferimento e il salvataggio nel File System e trasferisce dati su comando del suo PI. Il DTP può anche essere messo in uno stato "Passivo" che lo induce a stare lì ad ascoltare piuttosto che iniziare una connessione sulla porta dati.
server-PI
il server protocol interpreter che "ascolta" sulla porta L e stabilisce una connessione per il controllo della comunicazione. Esso riceve comandi FTP standard dal client PI, manda indietro le risposte e controlla il server DTP.
client FTP
Un software che comprende gli strati di interfaccia utente (user interface), di interpretazione dei comandi (Client PI) e di trasferimento dati (Client DTP).
client-DTP
Il data transfer process attende ascoltando sulla porta dati la connessione da un server FTP. Quetsa componente è inattiva se FTP viene usato per scambiare dati tra due host terzi (non consideriamo questa modalità di funzionamneto).
client-PI
L'interprete di protocollo lato client, che inizializza la connessione di controllo sulla sua porta U verso il server FTP, lancia comandi FTP e controlla il processo di trasferimento dati (user- o client-DTP).

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.

Torna all'inizio - I servizi