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.