FTP protokoll

Kirjutanud (lühendatult tõlkinud rfc 959-st) Meelis Roos (mroos@ut.ee)
1. FTP protokolli üldpõhimõtted.
                                            -------------
                                            |/---------\|
                                            ||   User  ||    --------
                                            ||Interface|<--->| User |
                                            |\----^----/|    --------
                  ----------                |     |     |
                  |/------\|  FTP käsud     |/----V----\|
                  ||Server|<---------------->|   User  ||
                  ||  PI  ||   FTP vastused ||    PI   ||
                  |\--^---/|                |\----^----/|
                  |   |    |                |     |     |
      --------    |/--V---\|    Andmed      |/----V----\|    --------
      | File |<--->|Server|<---------------->|  User   |<--->| File |
      |System|    || DTP  ||                ||   DTP   ||    |System|
      --------    |\------/|                |\---------/|    --------
                  ----------                -------------

                  Server-FTP                   USER-FTP

Andmeühendus ei pea kogu aja eksisteerima. Seda võib kasutada mõlemas suunas.

DTP (Data Transfer Process) - Andmete ülekandmise eest hoolitsev programmiosa

PI (Protocol Interpreter) - Tõlgib käske kasutaja ja protokolli vahel

server-DTP - võib kas 'kuulata' mõnel pordil või vajaduse korral ise andmeühenduse luua. Tegeleb ka andmete ülekandmisega.

server-PI - tegeleb serveri poolt juhtühendusega (kliendi saadetud käskudest aru saamine). Algselt 'kuulab', vaikimisi port 21 peal.

user-DTP - 'kuulab' andmeühenduse jaoks kokku lepitud pordil ja võtab ühenduse vastu. Kui andmeühendus luuakse 2 serveri vahel, ei tee user-DTP midagi.

user-PI - loob juhtühenduse, edastab FTP käske

Ühes kasutajaprotsessis võib olla mitu DTP-d. Juhtühenduses (user-PI ja server-PI vahel) kasutatakse telneti protokolli Andmeühendus (DTP-de vahel) - täisdupleks, formaat lepitakse kokku.

Faile võib üle kanda ka kahe serveri vahel, kasutades juhtimiseks kolmandas arvutis asuvat klientprogrammi. Siin on see skemaatiliselt kirjas:
                    Juhtimine  ------------ Juhtimine 
                    ---------->| User-FTP |<-----------
                    |          | User-PI  |           |
                    |          |   'C'    |           |
                    V          ------------           V
            --------------                        --------------
            | Server-FTP |        Andmed          | Server-FTP |
            |    'A'     |<---------------------->|    'B'     |
            -------------- Port (A)      Port (B) --------------
 
Juhtühendus peab olema avatud kogu ülekande ajaks. Ühenduse sulgemine on kliendi ülesanne.

2. FTP käsud.
Lühidalt:
USER - kasutajanime teatamine
PASS - parooli teatamine
ACCT - lisainfo security jaoks
CWD  - jooksva kataloogi muutmine
CDUP - cd .., süsteemist sõltumatu
SMNT - Structure Mount - ???
REIN - Reinitialize - taasinitsialiseerimine
QUIT - logout

PORT - andmete pordis kokku leppimine
PASV - passiivsesse rezhiimi mine
TYPE - andmete esitamises kokku leppimine
STRU - faili struktuuris kokku leppimine
MODE - ülekandeviis

RETR - faili tõmbamine
STOR - faili uploadimine
APPE - append
ALLO - ruumi reserveerimine
REST - tõmbamisega kuskilt kohast uuesti peale hakkamine
RNFR - rename from
RNTO - rename to
ABOR - tõmbamise katkestamine
DELE - delete, rmdir
RMD  - rmdir
MKD  - mkdir
PWD  - pwd
LIST - ls, kasutaja jaoks
NSLT - ls, süsteemi jaoks (lakoonilisem)
SYST - süsteemi tüübi küsimine
STAT - staatus
HELP - protokolli käskude olemasolu ja süntaksi uurimiseks
NOOP - tühikäsk
SITE - süsteemispetsiifilised lisakäsud
Nüüd kõigest selgemalt (käskudes ei tehta vahet suur- ja väiketähtedel). Iga käsu kirjelduse järel on tema formaat.

USER,PASS
        sisselogimine. Enne seda ei lasta suurt midagi teha.
	parooli (PASS) pole tingimata vaja. Kas on vaja, Seda saab aru 
	USER-i tulemuskoodist. Anonüümse ftp korral on kasutajanimeks
	anonymous või ftp, parooliks midagi suvalist, vahel peab selles
	sisalduma '@'. Sinna on viisakas panna oma e-maili aadress.
	Parooli ekraanilt peitmine on klientprogrammi asi, kui tegu on
	interaktiivse seansiga.
	Näiteks USER mroos
		 PASS integer
	USER <SP> <username> <CRLF>
	PASS <SP> <password> <CRLF>

ACCT - Lisainfo kasutaja identifitseerimiseks. Kas seda vaja on, saab aru
	PASS-i tulemusest. Vahel on ilma ACCT-ita võimalik faile ainult
	lugeda, kirjutamiseks on vajalik ACCT. Üldiselt harvaesinev käsk,
	mina pole teda kordagi kohanud.
	ACCT <SP> <account-information> <CRLF>

CWD - kataloogi muutmine, parameetriks path.
	Näiteks CWD pub/OS/Linux
	CWD  <SP> <pathname> <CRLF>

CDUP - kataloogipuus üks tase üles
	CDUP <CRLF>

SMNT - mingi mountimine ilma välja logimiata. Süsteemist sõltuv.
	SMNT <SP> <pathname> <CRLF>

REIN - logitakse user välja, ACCT tühistatakse, kõik parameetrid defaulti,
	käimasolevad ülekanded tehakse ilusti lõpuni.
	REIN <CRLF>

QUIT - lõpetada kõik ühendused. Kui käib andmete ülepumpamine, siis
	lõpetab ühenduse server. Kui juhtühendus ise peaks katkema,
	on see serverile samaväärne käsuga ABOR.
	QUIT <CRLF>
Ülekande parameetrite määramise käsud. Kõigil parameetritel on oma vaikeväärtused. FTP server on 'stateful' server - ta mäletab iga kliendi kohta käivat infot.

PORT - failide ülekandmise pordi määramine.
	Määrab 32-bitise IP aadressi ja 16-bitise TCP pordi numbri, et
	server teaks, kuhu ühendus avada, kui ta saatma hakkab. Kui
	serverile hakatakse andmeid saatma, öeldakse enne, et PASV.
	Näiteks PORT 193,40,8,130,2,40
	PORT <SP> <host-port> <CRLF>

PASV - serveri passiivsesse rezhiimi ajamine. See tähendab, et kohe avab
	klient andmeühenduse ja hakkab miskit saatma. Vastuseks tuleb
	info selle kohta, kus pordi peal server kuulab, ja kus masinas.
	PASV-i puhul ei kasutata vaikimisi olevat andmete porti 20.
	PASV <CRLF>

TYPE - andmete esitamise tüübi määramine. Esimese parameetriga
	määratakse tüüp (üks ASCII sümbol), olenevalt tüübist
	määratakse teise parameetri tüüp, kui on vaja 2. parameetrit.
	Parameetrid eraldatakse tühikuga.

	Parameetrite kirjeldus:
                         \    /
               A - ASCII |    | N - Non-print
                         |-><-| T - Telnet format
               E - EBCDIC|    | C - Carriage Control
                         /    \
               I - Image
 
               L <baidi suurus> - kohaliku baidi suurus

	vaikimisi on tüübiks ASCII, Non-printable. Kui muudetaks ainult
	esimest parameetrit, pannakse tüübiks uuesti non-print.
	TYPE <SP> <type-code> <CRLF>

STRU - faili struktuuri määramine. Argument - üks täht. Võimalikud
	väärtused: F - fail (ei mingit struktuuri)
		     R - fail koosneb kirjetest (record)
		     P - fail koosneb lehekülgedest (page)
	Vaikimisi F.
	STRU <SP> <structure-code> <CRLF>

MODE - failide ülepumpamise viis. Parameeter on üks ASCII täht.
	S - stream - puhas baidijada
	B - block -blokkstruktuur
	C - compressed - kasutatakse jooksva pikkuse kodeerimist
	Vaikimisi S.
	MODE <SP> <mode-code> <CRLF>

Teeninduskäsud. Argumendiks on tavaliselt path, "serveri keeles".

RETR - faili tõmbamine
	RETR <SP> <pathname> <CRLF>

STOR - faili serverisse saatmine. Kui sellenimeline fail oli olemas,
	kirjutatakse üle.
	STOR <SP> <pathname> <CRLF

STOU - Store unique - faili serverisse saatmine, nimeks saab jooksva
	kataloogi piires unikaalne nimi - server ise mõtleb selle välja
	ja tagastab koos vastusega.
	STOU <CRLF>

APPE - lisamine serveris olevale failile. Kui faili pole, luuakse.
	Seda kasutatakse ka teadete jätmiseks failinimede kujul, näiteks
	QUOTE APPE Tere, mina käisin siin!
	(quote on ftp kliendi jaoks).
	APPE <SP> <pathname> <CRLF>

ALLO - Ruumi hõivamine faili jaoks enne faili enda tulekut. Seda on harva
	vaja ja enamus servereid realiseerib selle tühja operatsioonina -
	teatab, et OK, aga midagi tegelikult ei tee. Parameetriks on
	baitide arv, kirje- ja lehekülgstruktuuriga failidel on teiseks
	parameetriks max. kirje/lk. pikkus.
	ALLO <SP> <decimal-integer>
            [<SP> R <SP> <decimal-integer>] <CRLF>

REST - restart - kuskilt kontrollpunktist peale faili uuesti tõmbama
	hakkamine. Parameetriks on marker, mille server on varem saatnud.
	Tegelikku tõmbamist ei alustata, ainult otsitakse failist õige koht
	välja. Järgnema peab RETR, et tõmmata.
	REST <SP> <marker> <CRLF>

RNFR - rename from - ümbernimetamise esimene pool, siin öeldakse faili
	esialgne nimi. Järgnema peab RNTO.
	RNFR <SP> <pathname> <CRLF>

RNTO - rename to - teine pool ümbernimetamisest. pärast seda käsku toimub
	tegelik rename. Kaheks on kogu protsess jagatud vist sellepärast, et
	lubada failinimedes suvalisi sümboleid - ka tühikuid, mida
	muidu kasutatakse parameetrite eraldamiseks.
	RNTO <SP> <pathname> <CRLF>

ABOR - ütleb serverile, et lõpetada eelmise käsu täitmine. Kui eelmine
	käsk on täidetud, ei juhtu midagi. Server peab hoolitsema, et
	ABOR võetaks vastu väljaspool järjekorda, s.t. ei oodata eelmise
	käsu lõpetamist.
	ABOR <CRLF>

DELE - kustutada serveris asuv fail. Kui on vaja Y/N küsimist, peab
	selle eest klientprogramm hoolitsema. RFC-s pole küll öeldud, aga
	tavaliselt kustutab DELE ka katalooge.
	DELE <SP> <pathname> <CRLF>

RMD - rmdir
	RMD  <SP> <pathname> <CRLF>

MKD - mkdir. Mõlemad käsud nõuavad katalooginime "serveri keeles".
	MKD  <SP> <pathname> <CRLF>

PWD - teatab jooksva kataloogi
	PWD  <CRLF>

LIST - saadab andmeühendust mööda kliendile kataloogi sisu. Võib para-
	meetri anda. LIST-i ajaks peab TYPE olema ASCII. Tagastatav info on
	rohkem inimese kui klientprogrammi jaoks. Viimane kasutab käsku NLST.
	LIST [<SP> <pathname>] <CRLF>

NLST - name list - server saadab kataloogi listingu. Seda kasutab klient
	näiteks MGET-i juures.
	NLST [<SP> <pathname>] <CRLF>

SYST - serveri tüübi küsimine. Saab teada OS tüübi, seega failinimede
	formaadi.
	SYST <CRLF>

SITE - süsteemispetsiifilised käsud. Näiteks selle aja määramine,
	mille server võtab timeout'iks:
	SITE IDLE 600   (see paneb 10 min.)
	Enamus unixi masinatega see töötab, aga näiteks vask.ut.ee logib
	kasutaja selle käsu peale välja.
	SITE <SP> <string> <CRLF>

STAT - serveri staatus. See peaks olema kõik, mida server selle kliendiga
	seoses teab. Tulemus tuleb vastusena, seega mööda juhtühendust.
	Võib ka kataloog/failinime anda, siis saab selle kohta infot.
	Sel juhul on argument nagu LIST-il.
	STAT [<SP> <pathname>] <CRLF>


HELP - Annab infot selle kohta, mis käsud ja mis süntaksiga konkreetsel
	serveril olemas on. FTP kliendist saab selle kätte käsuga
	remotehelp (= quote help)
	HELP SITE - saab teada, missugused SITE-käsud olemas on,
	näiteks ftp.funet.fi-s on SITE FIND pattern - failide otsimine.
	HELP [<SP> <string>] <CRLF>

NOOP - Server saadab lihtsalt OK tagasi. Sedasama teeb server tavaliselt
	ka siis, kui tal antud käsk on realiseeritud virtuaalselt
	(tunnistab käsku, aga ei tee tegelikult midagi).
	NOOP <CRLF>


3. Käskudele antavad vastused.
Vastused tulevad niisuguses imelikus formaadis, mis on loetav nii inimesele kui arvutile. Nimelt on vastuse esimesed kolm sümbolit numbriline vastus FTP kliendile ja seejärel tuleb tavaliselt kasutaja jaoks mõeldud tekst.
Kui tekst on pikem kui üks rida, siis on esimene rida eriline ja viimane rida ka. Nimelt kui tavaliselt eraldab arvu ja muud teksti tühik, siis siin on esimeses reas eraldajaks miinusmärk , edasised read ei alga numbriga (esimesel positsioonil pole number), viimase rea ees on sama number, mis on tekstist eraldatud jälle tühikuga.

Vastuste grupid:

1xx - positiivne vastus, OK
2xx - positiivne vastus, asi sai valmis
3xx - käsk täidetakse, kui tuleb vajalik lisainfo, näiteks USER
	vastab nii, et tahab parooli.
4xx - paha-paha, aga proovi uuesti (võimalik, et viga on mööduv)
5xx - käsku ei täidetud ega täidetagi, vähemalt niisugusel kujul.

x0x - tegu on süntaksiga - nt. 50x - vigane käsk
x1x - tegu on informatsiooniga - nt. staatus ja help
x2x - tegu on võrguühendustega
x3x - tegu on kasutajate identifitseerimise ja paroolidega
x4x - esialgu vaba
x5x - tegu on failisüsteemiga
Kolmas number on juba käsuspetsiifiline.
Täpsed teadete kirjeldused on olemas rfc-s (rfc 959 - ftp) punktis 4.2.1

4. Andmeühenduse kaudu liikuva info formaat

Tüübid: ASCII,EBCDIC,Image,Local
Image - 8bitine, Local - pole ette määratud, sõltub masinatest. Tekstitüüpide korral teevad masinad vajalikud kooditabeli / reavahetuse / ... asendused.

Formaat (käsu TYPE 2. parameeter): Non-print, telnet format controls, Carriage control (ASA). Määrab teksti vertikaalse formaatimise. Binary korral formaati ei kasutata. Võib puududa.

Faili võib saata 3 otstarbel - trükkimiseks, salvestamiseks jne, töötlemiseks. See määrataksegi formaadiga.

Non-print - formaadi kontroll puudub (vaikimisi).
Telnet Format Controls - kasutatakse Telneti erisümboleid.
Carriage control (ASA) - ASA standardi järgi (rfc 740 lisa C).

Failide struktuur

Faile on ftp jaoks 3 formaadis: file (baidijada), kirjetest ja lehekülgedest koosnevad failid.

File stucture - mingit sisemist struktuuri pole
Record-structure - fail koosneb järjestikustest kirjetest
Page-structure - fail koosneb sõltumatutest indekseeritud lehekülgedest
Faili formaat sõltub eeskätt opsüsteemist.

Failide ülekandmise viis (määratakse käsuga MODE): on kolm rezhiimi: üks ei tee andmetega midagi, teine pakib, kolmas formaadib ja lubab poole pealt uuesti alustada. Kõigis rezhiimides lõpetab faili ülekande EOF, selle võib käsitsi anda, aga aitab ka lihtsalt ühenduse sulgemisest. Kirjete eraldajad (EOR) on kohustuslikud. Lehekülgede korral lõpetab spetsiaalne lehekülg. Stream mode - andmed kantakse üle muudatusi tegemata. Lubatud on ka kirjestruktuurid. EOR ja EOF esitatakse kahe baidiga: esimene on 0xff ja kui teises baidis noorim bitt on 1 ja ülejäänud nullid, on tegemist EOR-ga ning kui 2. bitt on 1 ja ülejäänud on 0-d, on tegemist EOF-ga (s.t. väärtusteks on 1 ja 2). Kui tahetakse saata 0xff, saadetakse seda 2 korda. Block mode - andmed kantakse üle blokkidena. Aeg-ajalt saadab server juhtühendust mööda markeri ja pärast mingit viga saab hakata tõmbama mõne teadaoleva markeri kohalt. Compressed mode - Kasutatakse jooksva pikkuse kodeerimist. Keerulisem kui eelmised.