FTP

**Datņu pārsūtīšanas protokols** jeb **protokols FTP** () ir TCP/IP steka lietojuma slāņa protokols failu pārsūtīšanai starp datoriem. Tas ir klients-serveris arhitektūras bāzēts protokols. Uz FTP servera datora darbojas FTP servera programmatūra, kas saņem klientu savienojumu atvēršanas pieprasījumus. Klientu datori darbina FTP klientu programmatūru, kas izveido TCP savienojumu ar serveri. Pēc savienojuma izveides klients var veikt vairāku veidu darbības ar failiem, piemēram: augšuplādēt failus uz serveri (*upload*), lejuplādēt failus no servera (*download*), pārsaukt vai dzēst serverī esošos failus (*rename* & *delete*), utt. FTP ir atvērts standarts un tā programmatūra ir sastopama praktiski visām platformām, tāpēc to var lietot lai pārsūtītu failus starp dažādu arhitektūru datoriem un dažādām operētājsistēmām.

## Datu savienojuma atvēršanas metodes
FTP par transporta slāņa protokolu lieto tikai TCP. Ienākošajiem savienojumiem FTP serveri pēc noklusējuma lieto 21 portu. Klienta savienojums uz šo portu ir vadības savienojums (*control connection*). Caur šo savienojumu klients sūta komandas serverim un serveris sūta atbildes, bet šo savienojumu nelieto pašu failu pārsūtīšanai. Failu pārsūtīšanai FTP lieto datu savienojumus, kurus var izveidot dažādos veidos.

***Active mode*** (aktīvais režīms) - klients savā galā atver nejauši izvēlētu portu (porta numurs virs 1024) un serverim nosūta šo porta numuru. FTP serveris pēc tam izveido savienojumu ar šo portu un var sūtīt vai saņemt datus.

Lai šajā režīmā atvērtu datu savienojumu, klients nosūta komandu PORT, kuras argumenti ir klienta IP adrese un atvērtais ports. *adrese:ports* te ir kā 6 skaitļu virkne. "h1,h2,h3,h4,p1,p2", pirmie 4 skaitļi atbilst IP adresei, atlikušie divi - portam. Piem. ja IP adrese ir 192.168.0.2 un atvērtais ports ir 1025, tad klients nosūta komandu "PORT 192,168,0,1,4,1". ports ir h1*256+h2, šajā gadījumā 4*256+1.

***Passive mode*** (pasīvais režīms) - serveris savā galā atver nejauši izvēlētu portu (porta numurs virs 1024) un paziņo to klientam, kurš uz turieni veido savienojumu.

Lai šajā režīmā izveidotu datu savienojumu, klients nosūta komandu PASV, uz kuru serveris atbild apmēram šādi: "227 Entering Passive Mode (127,0,0,1,78,52)", kur šie seši skaitļi ir ar apmēram tādu pašu nozīmi kā PORT komandas argumenti aktīvajā režīmā.

Eksistē arī *extended passive mode*, kas ir līdzīga pasīvajam režīmām, tikai lieto citādāku argumentu formātu.

Tajā laikā, kad notiek datu pārraide caur datu savienojumu, vadības savienojumā nekas nenotiek. Tas dažreiz rada problēmas ar lielu failu pārsūtīšanu, ja pa vidu ir ugunsmūri, kas vardarbīgi pārtrauc vadības savienojumu.

FTP protokols nodrošina iespēju atsākt norautas lejupelādes izmantojot REST komandu. Šīs komandas arguments ir faila lejuplādētās daļas izmērs baitos. Augšuplāžu atsākšana ir problemātiskāka, jo nav precīzi zināms, kurā vietā pārsūtīšana pārtrūka, lai arī eksistē REST analoga APPE komanda. Failu izmēru var noteikt no direktoriju saraksta vai ar SIZE komandu.

## NAT–PT
Īpaši priekš FTP protokola darbības caur ugunsmūri tika izveidots NAT paplašinājums, kuru nosauca par NAT-PT (rfc2766), kurš ļauj veidot ienākošos savienojumus no servera uz klientu caur NAT. Izveidojot šādu savienojumu NAT maina sūtāmos datus, kas tiek pārsūtīti no klienta, norādot serverim patieso adresi un portu, ar kuru serveris var izveidot savienojumu un pēc tam pārraida savienojumu no servera no šīs adreses uz klienta adresi. Neskatoties uz visiem pasākumiem un jauninājumiem, kas likti lietā, lai atbalstītu FTP protokolu, praksē, NAT-PT funkcija visos maršrutētājos tiek atslēgta, lai sniegtu papildus drošību pret vīrusu draudiem.

## FXP
FXP (angliski File eXchange Protocol – Failu apmaiņas protokols) - veids, kā pārsūtīt failus starp diviem FTP serveriem pa tiešo, neielādējot datus savā datorā. Izveidojot FXP sesiju klients atver divus FTP savienojumus uz diviem dažādiem serveriem, pieprasot failu no pirmā servera norāda komandā PORT otra servera IP adresi.

Par viennozīmīgu priekšrocību FXP standarta atbalstā ir tas, ka gala lietotājus, kuri vēlas kopēt failus no viena FTP servera uz citu, vairs neietekmē viņu interneta pieslēguma ātruma ierobežojumi. Nav nepieciešamības sev lejupielādēt failu, lai pēc tam augšupielādētu to uz citu FTP serveri. Tātad, failu pārsūtīšanas ātrums būs atkarīgs tikai no interneta savienojuma ātruma starp diviem attālinātajiem FTP serveriem, kas lielākajā daļā gadījumu ir krietni ātrāks par lietotāju interneta pieslēgumiem.

FXP tagad sākuši izmantot hakeri, lai uzbruktu citiem serveriem; komandā PORT tiek norādīta IP adrese un ports, kuru izmanto serviss, kuram tiek veikts uzbrukums, un ar komandām RETR / STOR tiek veikts pieprasījums uz šo portu kā no FTP servera, nevis no uzbrūkošā datora, kas ļauj veikt liela mēroga DDoS uzbrukumus izmantojot uzreiz vairākus FTP serverus, vai apiet upura datora drošības sistēmu, ja tas pārbauda tikai klienta IP adreses, kas norādīta komandā PORT, atbilstību FTP klienta IP adresei un pēc noklusējuma aizliedz izmantot trešo pušu IP adreses. Tādējādi FXP nav iespējams izmantot strādājot ar publiskajiem FTP serveriem.

## FTP trūkumi
# Paroles, visas komandas un pārsūtāmo failu saturs netiek šifrēts, tāpēc to var pārtvert
# Tiek lietoti vairāki TCP savienojumi, tāpēc ja lieto ugunsmūri, tam nepieciešama speciāla konfigurēšana
# Aktīvā režīma klientu datu plūsmu grūti izlaist caur ugunsmūri, jo klienti atver nejauši izvēlētus portus, kur saņemt ienākošos savienojumus. Šī problēma lielākoties ir atrisināta, izmantojot pasīvā režīma FTP.
# Serverim iespējams norādīt, lai sūta datus uz kādu citu datoru, ne klientu, jo PORT komandā var norādīt jebkādu IP adresi un portu. Tas dažreiz var būt noderīgi (FXP).
# FTP ir *high latency* protokols, tas nozīmē, ka pārsūtot daudz mazu failu, pārsūtīšana notiks lēni. Tas tāpēc, ka lai uzsāktu pārsūtīšanu, klients un serveris apmainās ar vairākām komandām.
# Protokolā nav definēta failu integritātes pārbaude, tāpēc, ja vadības savienojums pārsūtīšanas laikā pārtrūkst, saņēmējs nevar droši zināt, vai saņemtais fails ir pabeigts vai nav. Dažiem serveriem ir paplašinājumi, kas var aprēķināt failu kontrolsummu, bet tie nav definēti standartā.
# Pārsūtot failus, nesaglabājas dati par faila izveidošanas/modificēšanas laiku (*timestamp*), pārsūtītajiem failiem uzliek pārsūtīšanas laika *timestamp*. (daži klienti gan izvelk šos datus no *directory listing*, un tur tāpēc viss ir ok)

## Datu formāts
Ir divi biežāk lietotie datu pārsūtīšanas režīmi:
# ASCII režīms (*ASCII mode*)
# binārais režīms (*binary mode*)
ASCII var pārsūtīt tikai vienkāršu tekstu, jebkāda cita veida dati pārsūtīšanas laikā tiks sabojāti. Šeit datus nosūta kā attiecīgo simbolu ASCII kodus. Klients tekstu saglabā savas platformas formātā (piem. sūtot unix formāta teksta failu no unix servera uz windows klientu, katras teksta rindas beigās LF vietā pieliks CR LF). Binārajā režīmā dati tiek pārsūtīti baits baitā, bez izmaiņām.

## Komandas un servera atbildes kodi
Parasti FTP implementē FTP klienti, kas ļauj lietot grafisko interfeisu un/vai kompozītās komandas (piemēram, pārsūtīt veselus direktorijus, kam vajag vairākas FTP komandas). Praktiski visas interneta pārlūkprogrammas nodrošina ierobežotu FTP klienta funkcionalitāti (iespēju lejupielādēt failus). Dažos gadījumos (internet explorer) iespējams arī pārsaukt un dzēst failus ftp serverī, kā arī augšupielādēt failus. FTP praktiski vienmēr lieto lietotāju identifikāciju autentifikāciju (lai tiktu pie failiem sākumā jānorāda lietotāja vārds un parole). Daudziem ftp serveriem ir lietotāja vārds *anonymous*, kuram var lietot jebkādu paroli (dažreiz arī nekādu). Praktiski visāsm interneta pārlūkprogrammām, lai pieslēgtos NEanonīmam ftp serverim, lietotāja vārdu un paroli var norādīt URL []. Servera_portu lieto tikai tad ja tas nav 21. Direktoriju arī bieži vien nenorāda.

FTP komandas (visi dati, kas iet caur vadības savienojumu) ir ASCII teksta bāzēti, tāpēc vienkāršas operācijas ir iespējamas izpildīt bez ftp klienta, lietojot tikai telnet. Servera atbildes kodi, tāpat kā HTTP un SMTP sastāv no trīsciparu skaitļiem. Aiz skaitļa dažreiz seko kļūdas (statusa) paskaidrojums vārdiem. FTP servera atbildes kodi:
* 1xx - pieprasītā darbība ir uzsākta, bet vēl nav pabeigta (sekos vēl viens vai vairāki ziņojumi)
* 2xx - pieprasītā darbība ir pabeigta (veiksmīgi), klients var dot jaunu komandu
* 3xx - pieprasītā darbība bija veiksmīga, bet lai turpinātu, jāprecizē tālākā darbība
* 4xx - pārejoša kļūda (pēc kāda laika atkārtojot šo kamandu, iespējama tās veiksmīga izpilde)
* 5xx - nepārejoša kļūda (pieprasītās darbības izpilde nebija veiksmīga un tā darbība nav iespējama)

### Pamata komandas
* ABOR - Pārtraukt faila pārsūtīšanu.
* CDUP - Nomainīt direktoriju uz augstāku.
* CWD - Nomainīt direktoriju.
* DELE - Dzēst failu (DELE faila nosaukums).
* EPSV – Pārslēgties uz paplašināto pasīvo režīmu. Tiek izmantots komandas PASV vietā.
* HELP - Parāda to komandu sarakstu, kuras atpazīst serveris.
* LIST - Parāda direktorija failu sarakstu. Saraksts tiek pārraidīts izmantojot datu savienojumu.
* MDTM - Parāda failu modifikācijas laiku.
* MKD - Izveidot direktoriju.
* NLST - Parāda direktorija failu sarakstu īsākā formā nekā komanda LIST. Saraksts tiek pārraidīts izmantojot datu savienojumu.
* NOOP – Tukša operācija
* PASV - Pārslēgties uz pasīvo režīmu. Serveris atgriež adresi un portu pie kura jāpievienojas, lai iegūtu datus. Nosūtīšana sāksies ievadot šādas komandas RETR, LIST utt.
* PORT - Pārslēgties uz aktīvo režīmu. Piemēram, PORT 12,34,45,56,78,89. Atšķirībā no pasīvā režīma datu pārsūtīšanai serveris pats pieslēdzas klientam.
* PWD - Parāda pašreizējo direktoriju.
* QUIT – Atslēgties.
* REIN - Reinicializē savienojumu.
* RETR - Lejupielādēt failu. Pirms šīs komandas jābūt komandai PASV vai PORT.
* RMD – Izdzēst direktoriju.
* RNFR un RNTO - Pārdēvēt failu. RNFR - kas jāpārdēvē (faila nosaukums), RNTO – par ko jāpārdēvē (faila nosaukums).
* SIZE - Parāda faila izmēru.
* STOR - Augšupielādēt failu. Pirms STOR komandas jābūt komandai PASV vai PORT.
* SYST - Parāda sistēmas tipu (UNIX, WIN, ...).
* TYPE – Noteikt faila pārsūtīšanas tipu (binārais, teksta).
* USER - lietotāja vārds, lai pieslēgtos serverim.

## RfC
FTP protokols ir standartizēts vairākos rfc:
*  (1985. gada oktobrī) galvenais apraksts (bija bijušas arī vecākas versijas (sākot ar ))
*  (1994. gada februārī) papildinājums: FTP un ugunsmūri
*  (1997. gada oktobrī) papildinājums: uzlabotas autentifikācijas metodes
*  (1998. gada septembrī) papildinājums: IPv5, NAT un vēl šis tas
*  (2007. gada martā) papildinājums: dažas uzlabotas failu pārsūtīšanas metodes

## Atsauces