2) Il protocollo ftp dice, CHIARAMENTE, che quando si invia un comando possono seguire una o più risposte e tutte terminanti con i due caratteri speciali \r\n.
E' così infatti, ma molto raramente capita.
Un possibile caso potrebbe essere quello in cui il server decide di chiudersi per fatti suoi nel qual caso ti manda un messaggio di sua iniziativa del tipo "4xx mi sto chiudendo" ma è qualcosa che succede molto di rado, in genere si chiude e basta.

Io stesso, in pyftpdlib, non ho implementato nessuna risposta "a sorpresa" di questo tipo e ipotizzo che la maggior parte dei server esistenti abbia fatto lo stesso.

A mio parere è una casistica che in fase di sviluppo iniziale puoi tranquillamente evitare di prendere in considerazione.

1)Devo ricrearlo io senza l'aiuto della libreria.
Lo devo fare per gli esami.
Capito. In tal caso torno a suggerirti di prendere spunto da ftplib.py.
FTP non è eccessivamente complesso. L'unica rottura è il fatto che hai due connessioni separate da gestire (canale comandi e dati) anzichè una, un parallelismo che devi risolvere utilizzando uno dei seguenti approcci:

- asincrono (quello che ho usato sviluppado pyftpdlib, tipicamente basato su select(), poll() e similari. puoi utilizzare, asyncore/asynchat della libreria standard, Twisted o similari)
- multi thread (modulo threading)
- multi processo (os.spawn() o il modulo multiprocessing di Python 2.6)

Ciao