Il File Transfer Protocol (FTP) (protocollo di trasferimento file), è un Protocollo per la trasmissione di dati tra host basato su TCP.
FTP è uno dei primi protocolli definiti ed ha subito una lunga evoluzione negli anni. La prima specifica, sviluppata presso il MIT, risale al 1971 (RFC-114). L'attuale specifica fa riferimento all' RFC-959.
Gli obiettivi principali di FTP descritti nella sua RFC ufficiale sono:
Promuovere la condivisione di file (programmi o dati)
Incoraggiare l'uso indiretto o implicito di computer remoti.
Risolvere in maniera trasparente incompatibilità tra differenti sistemi di stoccaggio file tra host.
Trasferire dati in maniera affidabile ed efficiente.
PI (protocol interpreter) è l'interprete del protocollo, utilizzato da client (User-PI) e server (Server-PI) per lo scambio di comandi e risposte. In gergo comune ci si riferisce ad esso come "canale comandi".
DTP (data transfer process) è il processo di trasferimento dati, utilizzato da client (User-DTP) e server (Server-DTP) per lo scambio di dati. In gergo comune ci si riferisce ad esso come "canale dati".
Funzionamento generale
FTP, a differenza di altri protocolli come ad esempio HTTP, utilizza due connessioni separate per gestire comandi e dati. Un server FTP rimane tipicamente in ascolto sulla porta 21 TCP a cui si connette il client. La connessione da parte del client determinerà l'inizializzazione del canale comandi attraverso il quale client e server si scambieranno comandi e risposte. Lo scambio effettivo di dati (come ad esempio file) richiederà l'apertura del canale dati il quale può essere di due tipi.
In un canale dati di tipo attivo il client apre una porta tipicamente random (> 1023), tramite il canale comandi rende noto il numero di tale porta al server e attende che esso si connetta. A tale scopo possono venire impiegati i comandi PORT o EPRT, a seconda del protocollo di rete utilizzato (tipicamente IPv4 o IPv6).
In un canale dati di tipo passivo il server apre una porta tipicamente random (> 1023), tramite il canale comandi rende noto il numero di tale porta al client e attende che esso si connetta. A tale scopo possono venire impiegati i comandi PASV o EPSV, a seconda del protocollo di rete] utilizzato (tipicamente IPv4 o IPv6).
Un server FTP offre svariate funzioni che permettono al client di interagire con il suo filesystem e i file che lo popolano, tra cui:
Download/upload di file.
Resume di trasferimenti interrotti.
Rimozione e rinomina di file.
Creazione di directory.
Navigazione tra directory.
FTP fornisce inoltre un sistema di autenticazione (N.B. in chiaro) degli accessi. Il client che si connette potrebbe dover fornire delle credenziali a seconda delle quali gli saranno assegnati determinati privilegi per poter operare sul filesystem. L'autenticazione cosiddetta "anonima" prevede che il client non specifichi nessuna password di accesso e che lo stesso abbia privilegi che sono tipicamente di "sola lettura".
Alloca spazio sufficiente per ricevere un file (raramente usato).
Append (with create)
APPE
<pathname>
Appende dati ad un file esistente.
Change to parent directory
CDUP
Va alla parent directory.
Change working directory
CWD
<pathname>
Cambia directory corrente.
Delete
DELE
<pathname>
Cancella file.
Help
HELP
<command>
Ritorna la lista dei comandi accettati dal server. Con argomento fornisce spiegazioni riguardo il comando specificato.
List
LIST
<pathname>
Lista il contenuto di una directory o le proprietà di un singolo file.
Trasfer mode
MODE
<mode-type>
Setta modalità di trasferimento (S=stream, B=block, C=compressed).
Make directory
MKD
<pathname>
Crea directory.
Name list
NLST
<pathname>
Ritorna il nome dei file della directory specificata.
Noop
NOOP
Non fa nulla (usato prevalentemente per prevenire disconnessioni per inattività prolungata).
Password
PASS
<password>
Specifica la password dell'utente.
Passive
PASV
Inizializza connessione dati passiva.
Data port
PORT
<host-port>
Inizializza connessione dati attiva.
Print working directory
PWD
Ritorna nome della directory corrente.
Logout
QUIT
Disconnette. Se un trasferimento è ancora in corso attende che termini prima di chiudere la sessione.
Reinitialize
REIN
Effettua il log-off dell'utente loggato.
Restart
REST
<marker>
Riprende il trasferimento dall'offset indicato.
Retrieve
RETR
<pathname>
Preleva file (da server a client).
Remove directory
RMD
<pathname>
Rimuove directory.
Rename from
RNFR
<pathname>
Rinomina (sorgente).
Rename to
RNTO
<pathname>
Rinomina (destinazione).
Site parameters
SITE
<command>
Manda comando specifico per il server (non standardizzato; varia tra implementazioni).
Structure mount
SMNT
<pathname>
Monta struttura (raramente usato).
Status
STAT
<pathname>
Ritorna statistiche riguardo il server. Con argomento lista il contenuto di una directory utilizzando il canale comandi.
Store
STOR
<pathname>
Spedisce un file (da client a server).
Store unique
STOU
<pathname>
Spedisce un file (da client a server) utilizzando un nome univoco.
File structure
STRU
<structure-code>
Setta struttura dati (F=file, R=record, P=page). Praticamente inutilizzato. Il valore di default è F.
System
SYST
Ritorna tipo di sistema operativo.
Representation type
TYPE
<type>
Setta modalità di trasferemnto (A=ASCII, E=EBCDIC, I=Binary, L=Local). Il valore di default è A. EBCDIC e Local sono raramente usati (esempio: unicamente su sistemi mainframe).
User Name
USER
<username>
Specifica nome utente.
Codici di risposta
1xx: Risposta positiva preliminare. L'azione richiesta è iniziata ma ci sarà un'altra risposta ad indicare che essa è effettivamente completata.
2xx: Risposta positiva definitiva. L'azione richiesta è completata. Il client può ora mandare altri comandi.
3xx: Risposta positiva intermedia. Il comando è stato accettato ma è necessario mandarne un secondo affinché la richiesta sia completata definitivamente.
4xx: Risposta negativa temporanea. Il comando non è andato a buon fine ma potrebbe funzionare in un secondo momento.
5xx: Risposta negativa definitiva. Il comando non è andato a buon fine e il client non dovrebbe più ripeterlo.
x0x: Errore di sintassi.
x1x: Risposta ad una richiesta informativa.
x2x: Risposta relativa alla connessione.
x3x: Risposta relativa all'account e/o ai permessi.
x4x: Non meglio specificato.
x5x: Risposta relativa al file-system.
Problemi relativi alla sicurezza
La specifica originale di FTP non prevede alcuna cifratura per i dati scambiati tra client e server. Questo comprende nomi utenti, password, comandi, codici di risposta e file trasferiti i quali possono essere "sniffati" o visionati da malintenzionati in determinate situazioni (esempio: ambienti intranet).
Il problema è comune a diversi altri protocolli utilizzati prima della diffusione di SSL quali HTTP, TELNET e SMTP. Per ovviare al problema è stata definita una nuova specifica che aggiunge al protocollo FTP originale un layer di cifratura SSL/TLS più una nuova serie di comandi e codici di risposta. Il protocollo prende il nome di FTPS ed è definito nella RFC-4217. Da non confondersi con SFTP che è comunque una valida alternativa per ovviare al problema descritto.