Programowanie Sieciowe 2 Protokoły komunikacyjne: FTP mgr inż. Tomasz Jaworski tjaworski@kis.p.lodz.pl http://tjaworski.kis.p.lodz.pl/
Protokoły komunikacyjne FTP File Transfer Protocol 2
Informacje o protokole FTP w sieci Internet RFC 959: http://www.networksorcery.com/enp/rfc/rfc959.txt Polecenia FTP: http://www.nsftools.com/tips/rawftp.htm Kody odpowiedzi: http://www.jtpfxp.net/ftperror.htm Wikipedia: http://en.wikipedia.org/wiki/file_transfer_protocol http://en.wikipedia.org/wiki/list_of_ftp_server_return_codes 3
Protokół FTP File Transport Protocol Protokół transmisji plików binarnych i tekstowych; protoplasta dzisiejszego pojęcia Peer-2-Peer Podobnie jak HTTP, FTP jest protokołem tekstowym, opartym na przesyłaniu odpowiedzi (responses) na żądania klienta (requests) Przed erą stron WWW, FTP był najpopularniejszą metodą wymiany plików 4
Protokół FTP: najważniejsze cechy Wykorzystuje dwa kanały transmisji w warstwie protokołu TCP Do transmisji poleceń sterujących (control) Do transmisji danych binarnych (data transfer) Protokół oparty jest na liniach tekstu. Każda linia rozdzielona jest symbolem CRLF (C/C++/C#: "\r\n") (\r = 13; \n=10) 5
Do czego służy protokół FTP? Do kopiowania programów i/lub plików danych między dwoma urządzeniami Do tworzenia bazy danych (nie w sensie baz relacyjnych) wykorzystanie komputerów do przechowywania dużej ilości plików Popularne zastosowania FTP to: Przesyłanie danych między komputerem w miejscu pracy a komputerem w domu, jeśli ktoś lubi pracę po godzinach Wysyłanie stron i plików na serwer WWW (w ramach procesu publikacji strony Web) Wiele istniejących serwerów pozwala na tzw. logowania anonimowe (user = anonymous) i dowolne pobieranie plików objętych tym kontem. Pliki na koncie anonymous są plikami dostępnymi publicznie. 6
Problemy stojące przed klientem i serwerem FTP Różne systemy operacyjne (w tym systemy dedykowane) różnią się: Strukturą katalogów Strukturą plików i systemu plików atrybuty, uprawnienia, właściciel Sposobem nazwania plików (np. kropka przed nazwą) Kodowaniem znaków w nazwach plików Długości ścieżek, nazw plików, rozszerzenia 7
Charakterystyka połączeń FTP Klient komunikuje się z serwerem za pomocą dwóch połączeń TCP Sterujące, transmisja żądań i odpowiedzi Serwer oczekuje na klienta na porcie 21. Klient łączy się z dowolnego portu lokalnego do portu 21 serwera. Serwer pierwszy zamyka połączenie (na polecenie QUIT) Danych, transmisja danych Tryb aktywny: Klient otwiera port i informuje o nim serwer (przekazuje IP i port) Serwer łączy się do wskazanego portu i rozpoczyna się wymiana danych Tryb pasywny: Serwer otwiera port i informuje o nim klienta (przekazuje IP i port) Klient łączy się do wskazanego portu i rozpoczyna się wymiana danych 8
Tryb aktywny Klient nawiązuję połączenie na port 21 Klient wybiera plik do pobrania Tryby komunikacji między serwerem a klientem FTP Polecenie PORT Klient otwiera port N i informuje o nim serwer Serwer łączy się z klientem (na podany port N) i następuje wymiana danych Tryb pasywny Klient nawiązuję połączenie na port 21 Klient wybiera plik do pobrania Polecenie PASV Serwer otwiera port N i informuje o nim klienta Klient łączy się z serwerem (na podany port N) i następuje wymiana danych 9
Tryb aktywny Tryby komunikacji między serwerem a klientem FTP Polecenie PORT Klient wysyła polecenie PORT: PORT 127,0,0,1,23,211 Tryb pasywny Klient wysyła polecenie PASV Serwer odpowiada: 227 Entering Passive Mode (212,22,34,81,34,32) Polecenie PASV IP: 127,0,0,1 = 127.0.0.1 Port: 23,211 = 23 * 256 + 211 = 6099 Zatem serwer łączy się pod adres 127.0.0.1:6099 IP: 212.22.34.81 Port: 34 * 256 + 32 = 8736 Zatem klient łączy się z serwerem pod adresem 212.22.34.81:8224 10
Tryb aktywny wymiany danych FTP Klient wykonuje połączenie TCP do portu 21 serwera FTP. Połączenie to jest połączeniem sterującym. Przy nawiązywaniu połączenia transmisji danych klient wysyła polecenie PORT aby poinformować serwer, do jakiego portu klienta powinien się on połączyć. W chwili wysłania polecenia PORT klient uruchamia nasłuch na tym porcie. Serwer łączy się z klientem na podanym porcie, tworząc połączenie danych. Specyfikacja przewiduje, że połączenia danych z serwera nawiązywane są z portu 20. Klient natomiast przyjmuje połączenie na porcie o 1 wyższym niż port, z którego wcześniej nawiązał połączenie sterujące. Klient 2202 2201 21 Serwer 20 Nawiązanie połączenie Wymiana poleceń i odpowiedzi Klient chce pobrać plik Nawiązanie połączenia Przesłanie zawartości pliku 11
Tryb pasywny wymiany danych FTP Klient wykonuje połączenie TCP do portu 21 serwera FTP. Połączenie to jest połączeniem sterującym. Przy nawiązywaniu połączenia transmisji danych, klient wysyła polecenie PASV. Serwer odpowiada na to polecenie tworząc nowe gniazdo nasłuchowe (dla połączenia danych) oraz informuje o nim klienta. Klient łączy się na podane gniazdo i numer IP tworząc połączenie danych. Klient 2202 2201 Nawiązanie połączenie Wymiana poleceń i odpowiedzi Klient chce pobrać plik; wysyła PASV Serwer wysyła inf. o IP i porcie 21 Serwer 20 Nawiązanie połączenia Przesłanie zawartości pliku 12
Format żądania (requests) protokołu FTP Linia tekstu, zakończona dwoma bajtami (symbol końca linii): CRLF = "\r\n"; Postać: POLECENIE <SP> <parametry>\r\n Przykład: USER tjaworski\r\n NOOP\r\n RETR zlecenie.doc\r\n CWD /\r\n <SP> = spacja (1 bajt) 13
Polecenia protokołu FTP (1/4) USER Nazwa użytkownika/konta serwera FTP PASS Hasło użytkownika (jeśli USER anonymous) ACCT Informacje o koncie (również przed logowaniem) CWD Zmiana aktualnego katalogu CDUP Zmiana katalogu na wyższy (CD..) SMNT Podmontowanie (mount) innego systemu plików QUIT Kontrolowane zakończenie połączenia REIN Restart połączenia (z dokończeniem transmisji) PORT Informacja o IP i porcie klienta dla kanału danych Minimum dla trybu pasywnego, dodatkowo dla trybu aktywnego 14
Polecenia protokołu FTP (2/4) PASV TYPE STRU MODE RETR SIZE STOR STOU Żądanie danych dla trybu pasywnego info Określenie typu transmisji danych (np. ascii/binary) Struktura przesyłanego obiektu Tryb przesyłania Pobranie pliku z serwera (retrieve) Pobranie długości pliku. Zero, jeśli nazwa to katalog Umieszczenie pliku na serwerze (store) Umieszczenie pliku na serwerze pod unikalną (losową) nazwą. Serwer decyduje o nazwie. 15
Polecenia protokołu FTP (3/4) APPE ALLO REST RNFR RNTO ABOR DELE RMD MKD Dodanie danych na końcu pliku (jeśli ten istnieje) Alokacja (zarezerwowanie) miejsca na serwerze Restart przesyłania danych Określenie pliku do zmiany nazwy Nowa nazwa dla określonego poprzednio pliku Przerwanie transferu danych (jeśli istnieje) Usunięcie zadanego pliku z serwera Usunięcie zadanego katalogu z serwera Utworzenie nowego katalogu na serwerze 16
Polecenia protokołu FTP (4/4) PWD LIST NLST SYST STAT HELP NOOP Podanie aktualnego katalogu sesji Przesłanie listy plików (lista jest plikiem) Przesłanie listy plików (same nazwy) Serwer zwraca informacje o systemie operacyjnym Status aktualnej transmisji danych Pomoc ogólna lub dla wybranego polecenia Serwer nie wykonuje operacji (puste polecenie) 17
Najważniejsze komendy FTP Autoryzacja USER określa nazwę użytkownika PASS określa hasło dla podanego użytkownika Operacje na listach plików (systemie plików) LIST przesłanie listy plików i katalogów z danej scieżki CWD zmiana aktualnego katalogu Pobieranie lub wysyłanie plików TYPE określenie typu transmisji; A=ASCII; I=Binary RETR pobranie pliku z serwera STOR wysłanie pliku na serwera Zamykanie połączenia QUIT klient chce zamknąć połączenie 18
Format poleceń protokołu FTP USER <SP> <username> <CRLF> PASS <SP> <password> <CRLF> ACCT <SP> <account-information> <CRLF> CWD <SP> <pathname> <CRLF> CDUP <CRLF> SMNT <SP> <pathname> <CRLF> QUIT <CRLF> REIN <CRLF> PORT <SP> <host-port> <CRLF> PASV <CRLF> TYPE <SP> <type-code> <CRLF> STRU <SP> <structure-code> <CRLF> MODE <SP> <mode-code> <CRLF> RETR <SP> <pathname> <CRLF> STOR <SP> <pathname> <CRLF> STOU <CRLF> APPE <SP> <pathname> <CRLF> ALLO <SP> <decimal-integer> [<SP> R <SP> <decimal-integer>] <CRLF> REST <SP> <marker> <CRLF> RNFR <SP> <pathname> <CRLF> RNTO <SP> <pathname> <CRLF> ABOR <CRLF> DELE <SP> <pathname> <CRLF> RMD <SP> <pathname> <CRLF> MKD <SP> <pathname> <CRLF> PWD <CRLF> LIST [<SP> <pathname>] <CRLF> NLST [<SP> <pathname>] <CRLF> SITE <SP> <string> <CRLF> SYST <CRLF> STAT [<SP> <pathname>] <CRLF> HELP [<SP> <string>] <CRLF> NOOP <CRLF> <SP> = spacja (1 bajt) <CRLF> = symbol nowej linii 19
Format odpowiedzi (responses) protokołu FTP Każda odpowiedź jest linią tekstu, zakończoną symbolem \r\n symbol nowej linii Linia składa się z następujących elementów: liczby (3 cyfry) kod odpowiedzi, Spacja (<SP>) lub myślnik (<DS>) dla odpowiedzi wielolinijkowych, Tekst (informację tekstową) + ewentualne dane w zależności od polecenia, którego tyczy się interpretowana odpowiedź, Symbolu końca linii <CRLF>. Trzycyfrowy kod określa typ odpowiedzi (np. potwierdzenie, odrzucenie, ) 20
Trzycyfrowe kody odpowiedzi (1/5) Xyz 1yz Odpowiedź pozytywna, przejściowa (preliminary). Serwer rozpoczął wykonywanie przesłanego polecenia. Klient powinien zaczekać z wysłaniem kolejnego polecenia na następną odpowiedź serwera. 150 nawiązanie połączenia danych (i rozpoczęcie transmisji) 226 pozytywne zakończenie transmisji 2yz Pozytywne zakończenie wykonywania. Serwer pomyślnie zakończył wykonywanie polecenia, klient może wysyłać kolejne polecenia. 200 pozytywne wykonanie polecenia (np. TYPE) 21
Trzycyfrowe kody odpowiedzi (2/5) Xyz 3yz Odpowiedź pozytywna, cząstkowa (intermediate). Serwer zaakceptował polecenie, jednak do rozpoczęcia działania lub przesłania ostatecznego wyniku konieczne jest przesłanie dodatkowych informacji przez klienta. 331 potwierdzenie nazwy użytkownika (USER) i oczekiwanie na hasło RNFR, RNTO zmiana nazwy (dwa polecenia; RNTO wykonuje zmianę) 4yz Odpowiedź negatywna, przejściowa (transient). Serwer odrzucił polecenie, jednak powody odrzucenia mogą ustać. 425 nie można nawiązać połączenia 22
Trzycyfrowe kody odpowiedzi (3/5) Xyz 5yz Odpowiedź negatywna, stała (permanent). Serwer odrzucił polecenie i odrzuci przy każdej kolejnej próbie. Klient powinien zaprzestać przesyłania danego żądania. 500 błąd składni, polecenie nieznane 530 hasło nie zostało przyjęte 23
Trzycyfrowe kody odpowiedzi (4/5) xyz x0z Błąd składni przesłanego polecenia, składniowy błąd w parametrach danego polecenia, niezaimplementowane polecenie. 500 błąd składni, polecenie nieznane x1z Odpowiedź dla poleceń klienta żądających informacji, np. STATUS, SYST, HELP. x2z Informacje odnoszące się do połączenia sterującego lub połączenia danych. 227 - Entering Passive Mode (a1,a2,a3,a4,p1,p2) - PASV 24
Trzycyfrowe kody odpowiedzi (5/5) xyz x3z Informacja związana z procesem logowania bądź administracją konta. 230 Użytkownik (bądź anonim) został poprawnie zalogowany. x4z Zarezerwowane; do wykorzystania w przyszłości x5z Informacja na temat stanu transferu pliku lub innego polecenia związanego z systemem plików. 257 Aktualnym katalogiem jest - PWD, CWD 150 nawiązanie połączenia danych (i rozpoczęcie transmisji) 25
Najczęściej występujące kody odpowiedzi 1xy 150 Rozpoczęcie transferu pliku, serwer za chwile otworzy połączenie danych. Kod 150 oznacza, że klient może rozpocząć tworzenie połączenia danych (tryb pasywny) lub serwer zaraz zacznie łączyć się z klientem (tryb aktywny). 26
Najczęściej występujące kody odpowiedzi 2xy 200 Potwierdzenie wykonania polecenia, np. dla TYPE. 213 Informacja o pliku, np. wielkość dla SIZE 215 Informacja o systemie operacyjnym, np. dla SYST 220 Powitanie serwera, przesyłane zaraz po połączeniu. 226 Połączenie danych zostaje zakończone. Ostatnia operacja na pliku zakończyła się pomyślnie (transfer lub przerwanie - ABORT). Najcześciej 226 informuje o zakończeniu transmisji z i do serwera. 227 Wejście do trybu pasywnego, format: %d,%d,%d,%d,%d,%d (6 liczb 0-255). 230 Poprawne zalogowanie użytkownika. Kod 230 wysyłany jest po podaniu hasła (PASS), jeśli to jest poprawne. 257 Informacja o ścieżce, np. dla CWD lub PWD. Format: "%s" 27
Najczęściej występujące kody odpowiedzi 3xy 331 Odpowiedź na USER. Nazwa użytkownika została przyjęta, teraz klient musi wysłać hasło (PASS). 28
Najczęściej występujące kody odpowiedzi 4xy 425 Błąd podczas nawiązywania połączenia danych. Np. klient nie połączył się z serwerem w zadanym czasie (tryb pasywny) lub serwer nie mógł się połączyć z klientem na podany przez niego adres IP i port (tryb aktywny) 29
Najczęściej występujące kody odpowiedzi 5xy 500 Błąd składni, linia żądania zbyt długa lub polecenie nie zostało rozpoznane. 530 Użytkownik nie został zalogowany, np. Odpowiedź na błędne hasło dla danego użytkownika. 550 Pliki/katalogi: żądnie nie mogło zostać zrealizowane (np. brak pliku, brak katalogu lub brak dostępu) 30
drwxrw-rw- 1 root root -rwxrw-rw- 1 root root drwxrw-rw- 1 root root -rwxrw-rw- 1 root root Format listy plików 0 Mar 1 11:17 katalog1 235 Mar 1 11:17 plik1 0 Mar 1 2010 katalog2 33637 Mar 1 2010 plik2 Kod w C# generujący listę plików: http://tjaworski.kis.p.lodz.pl/ps2/makedirlisting.cs MakeDirListing generuje listę plików i zapisuje ją w tymczasowym katalogu systemu Windows dla danego użytkownika. Funkcja zwraca ścieżkę i nazwę pliku tymczasowego. Wymagania: string GetCurrentPath() Metoda GetCurrentPath() ma zwrócić aktualnąścieżkę dla danej sesji FTP. Ścieżka ma być poprawna z punktu widzenia lokalnego systemu plików, nie z punktu widzenia sesji FTP. 31
FTP a TFTP TFTP Trivial File Transfer Protocol (RFC 1350) Wykorzystywany do przesyłania danych konfiguracyjnych oraz obrazów systemów operacyjnych w procesie uruchamiania; Zbudowany na protokole UDP, najczęściej port 69; Tylko 5 typów poleceń Dane przesyłane w blokach po 512 bajtów; Wykorzystuje jedno połączenie (FTP wykorzystuje dwa) Brak autoryzacji; Brak obsługi katalogów; Brak możliwości listowania plików w obszarze udostępnionym przez serwer; Możliwe przesyłanie plików do i z serwera; Protokół TFTP ma być prosty i łatwy w implementacji; 32
Testowanie serwera Można użyć najpopularniejszych narzędzi: Total Commander Mozilla Firefox Internet Explorer 33
Testowanie serwera Można użyć najpopularniejszych narzędzi: Total Commander Mozilla Firefox Internet Explorer 34
Connect to: (2011-03-02 12:57:10) hostname=localhost username=tjaworski startdir= localhost=127.0.0.1 220-GuildFTPd FTP Server (c) 1997-2002 220-Version 0.999.14 220 Please enter your name: USER tjaworski 331 User name okay, Need password. PASS *********** 230 User logged in. SYST 215 UNIX Type: L8 Server FEAT 500 'FEAT': command not understood. Komunikacja z Total Commanderem 35
HELP SITE 502 Unknown command. CLNT Total Commander (UTF-8) 500 'CLNT': command not understood. OPTS UTF8 ON 500 'OPTS': command not understood. Connect ok! PWD 257 "/" is current directory. Pobierz katalog TYPE A 200 Type set to A. PASV 227 Entering Passive Mode (127,0,0,1,5,89) LIST 150 Opening ASCII mode data connection for /bin/ls (514 bytes). Ściąganie Czekam na serwer... 226 Transfer successful. 36
Klient FTP: Zrzut komunikacji z przeglądarką Mozilla Firefox ---> 220-Simple FTP server ---> 220 Enter user name: USER anonymous ---> 230 Anonymous user logged in. SYST ---> 215 UNIX Type: L8 PWD ---> 257 "/" is current dir TYPE I ---> 200 Type set to I PASV ---> 227 Entering Passive Mode (127,0,0,1,3,232) 127.0.0.1:1000 SIZE / ---> 213 0 MDTM / ---> 500 'MDTM': command not understood RETR / ---> 550 Permission denied PASV ---> 227 Entering Passive Mode (127,0,0,1,3,233) 127.0.0.1:1001 CWD / ---> 257 "/" is current dir LIST ---> 150 Opening data connection for /bin/ls (610 bytes). ---> 226 Transfer successful. Transmisja zaraz po połączeniu 37
Klient FTP: Zrzut komunikacji z przeglądarką Mozilla Firefox PASV ---> 227 Entering Passive Mode (127,0,0,1,3,234) 127.0.0.1:1002 SIZE /Rad.Designer ---> 213 0 MDTM /Rad.Designer ---> 500 'MDTM': command not understood RETR /Rad.Designer ---> 550 Permission denied PASV Przejście do katalogu /Rad.Designer ---> 227 Entering Passive Mode (127,0,0,1,3,235) 127.0.0.1:1003 CWD /Rad.Designer ---> 257 "/Rad.Designer" is current dir LIST ---> 150 Opening data connection for /bin/ls (80 bytes). ---> 226 Transfer successful. 38
PASV Klient FTP: Zrzut komunikacji z przeglądarką Mozilla Firefox ---> 227 Entering Passive Mode (127,0,0,1,3,242) 127.0.0.1:1010 SIZE /phd.jpg ---> 213 48940 MDTM /phd.jpg ---> 500 'MDTM': command not understood RETR /phd.jpg ---> 150 Opening data connection for /phd.jpg ---> 226 Transfer successful. Pobranie pliku phd.jpg 39
Sugestie dotyczące implementacji w C# Klasy gniazdowe oraz obsługa wielu wątków znajduje się w przestrzeniach: System.Net; System.Net.Sockets; System.Threading; W zależności od konfiguracji systemu (uprawnień), uruchomienie nasłuchu na porcie < 1024 (w tym wypadku 21) może generować błędy. Pisany serwer FTP może stać na innym porcie, np. 2100 Serwer powinien domyślnie akceptować użytkownika anonymous. Ułatwi to testowanie programami klienckimi. W reakcji na polecenie PASV, serwer powinien określić numer nowego portu nasłuchu (np. przez wartość globalnego licznika) a następnie sprawdzić, czy wybrany port można otworzyć. 40
Sugestie dotyczące implementacji w C# Zaraz po nawiązaniu połączenia, serwer powinien dopuszczać tylko dwa polecenia: USER oraz PASS. Każde inne powinno kończyć się odpowiedzią 500 Command not understood. Minimalna implementacja serwera FTP to: USER, PASS, SYST, PWD, CWD, PASV, LIST, RETR, SIZE, STOR, TYPE Procedura przesyłania listy plików i katalogów do klienta (polecenie LIST) korzysta z połączenia danych. Zatem serwer może generować plik z listą a następnie wykorzystać istniejącą procedurę wysyłania plików. Należy pamiętać o różnicy w znakach rozdzielających nazwy katalogów i plików: / oraz \. System Windows używa \ podczas gdy protokół FTP używa / 41
Dziękuję za uwagę!