FTP (File Transfer Protocol) — протокол передачи файлов. FTP придумали в 1971 году, еще до того, как появились протоколы TCP/IP. Сначала FTP работал поверх протокола NCP. Версия на основе TCP/IP появилась в 1980 году. А в 1985 году была принята спецификация FTP, которой пользуются до сих пор, позже в неё были добавлены полезные расширения, такие как, пассивный режим и поддержка IPv6.
Место протокола FTP в стеке TCP/IP
В стеке TCP/IP протокол находится на прикладном уровне.
Принцип работы протокола FTP
Протокол FTP работает в режиме клиент сервер. На сервере есть файловая система, это структура каталогов в которой находятся файлы. Клиент по протоколу FTP подключается к серверу и может работать с файловой системой, просматривать каталоги, переходить между ними, загружать и записывать файлы сервера, перемещать их между разными каталогами и выполнять другие операции, которые можно делать с файловой системой.
Протокол FTP, также как и HTTP для адресации файлов использует url. Например, ftp://ftp-server.ru/pub/documents/latex/example1.tex.
URL состоит из 3-х частей:
- первая часть ftp — идентификатор протокола;
- вторая часть ftp-server.ru — имя сервера, здесь может быть DNS имя либо IP адрес;
- третья часть pub/documents/latex/example1.tex — путь к файлу, файловой системе и само имя файла.
В отличии от других протоколов прикладного уровня, протокол FTP использует два отдельных соединения. Первое соединение управляющее, второе соединение для передачи данных.
Взаимодействие с транспортным уровнем
FTP использует протокол транспортного уровня TCP, а для управляющего соединения на сервере используется порт 21. Соединение для данных может быть установлено в двух режимах: в активном и пассивном, при этом используются разные номера портов.
В активном режиме FTP инициатором установки соединения для передачи данных является сервер. В этом случае используется порт 20 на сервере, а со стороны клиента порт больше 1024.
Однако, если между сервером и клиентом находится межсетевой экран или устройство трансляции сетевых адресов NAT, то сервер установить соединение с клиентом не сможет. В этом случае используется пассивный режим, при котором соединение для передачи данных устанавливает клиент. В пассивном режиме и на клиенте и на сервере используются порты с номерами больше, чем 1024.
Аутентификация в FTP
Протокол FTP требует, чтобы пользователь прошел аутентификацию. Для этого необходимо ввести идентификатор и пароль. В зависимости от идентификатора пользователя ему может быть предоставлено больше или меньше прав для доступа к файловой системе сервера.
Специальный тип пользователя FTP — анонимный пользователь. Для анонимного пользователя в качестве логина используется ftp, или anonymus, а в качестве пароля может использоваться все, что угодно, но рекомендуется использовать свой email. Как правило анонимный пользователь имеет ограниченные права, обычно он может только скачивать файлы и записывать файлы в один определенный каталог.
Команды протокола FTP
Протокол FTP, как и многие протоколы прикладного уровня работает в текстовом режиме. Команды FTP похожи на команды протокола POP3. Большинство из них состоит из 4-х символов, команды:
- Команды USER и PASS используются для аутентификации;
- LIST позволяет посмотреть содержимое текущего каталога;
- CWD поменять текущий каталог;
- RETR позволяет загрузить файл с сервера на клиент;
- STOR позволяет сохранить файл на сервере;
- Протокол FTP может передавать данные в двух режимах, текстовом и бинарном. В текстовом режиме возможна отправка управляющих символов, которые будут обработаны специальным образом. В бинарном режиме, обработка специальных символов не производится. Для выбора режима, который будет использоваться для передачи файлов, служит команда TYPE;
- DELE позволяет удалить файлы;
- Команды MKD и RMD используются для создания и удаления каталога;
- По умолчанию FTP сервер работает в активном режиме, т.е. соединение для передачи данных устанавливает сервер. Команда PASV служит для перехода в пассивный режим;
- Команда QUIT используется для корректного закрытия соединения FTP после того, как все необходимые операции с файлами и каталогами были завершены.
Пример сеанса FTP
Мы подключились к серверу на порт 21, создали управляющее соединение, сервер нам выдал ответ.
Ответ FTP сервера, также как и ответы серверов многих прикладных протоколов состоят из двух частей, первая 220 статус, а вторая поясняющее сообщение Welcome to the FTP Server. Статус ответа 220, коды которой начинаются с 2, говорят об успешном выполнении команды, поясняющее сообщение содержит приветствие “Добро пожаловать на FTP сервер”.
Сначала необходимо пройти аутентификацию. Для этого используется команда USER anonymous и мы хотим подключиться, как анонимный пользователь.
Сервер отвечает сообщением со статусом 331. Код, который начинается с 3 говорит о том, что предыдущая команда была выполнена успешно и ожидается продолжение выполнения связанных действий.
331 Guest login ok, send your complete e-mail address as password. В данном случае сервер говорит, что он принимает гостевой логин, т.е. идентификатор анонимного пользователя и просит прислать ваш e-mail в качестве пароля.
В данном случае это отрывок из FTP сессии, который используется для загрузки файлов из браузера Chrome. Chrome в качестве пароля отправляет строку PASS chrome@examole.com, которая похожа на e-mail.
Сервер никак не анализирует e-mail, который ему передали, говорит, что аутентификация прошла успешно, но права доступа ограничены 230 Guest login ok, access restrictions apply.
Устанавливаем бинарный режим передачи файлов с помощью команды TYPE 1. Сервер отвечает, что тип передачи данных успешно установлен в 1. 200 Type set to 1.
Мы хотим загрузить сервера в файл, показан путь /pud/tex/latex/llncs2e.zip, но перед тем как загрузить, мы хотим узнать его размер, для этого выдаем команду SIZE /pud/tex/latex/llncs2e.zip. Сервер в ответ выдает размер файла в байтах 213 230229.
Переходим в пассивный режим с помощью команды PASV.
В ответ сервер говорит, что он перешел в пассивный режим 227 Entering Passive Mod (213, 71, 6, 142, 35, 141) и передает нам 6 чисел, которые нужно использовать для установки соединения для передачи данных. Первые 4 числа это IP-адрес, вторые два числа используются, чтобы узнать порт на который нужно установить соединение. Первое число 35 нужно умножить на 256 и прибавить второе число 141, так мы узнаем порт.
Для того, чтобы загрузить нужный нам файл используем команду RETR /pud/tex/latex/llncs2e.zip. После того, как мы выдали эту команду сервер ждет, что мы установим соединение с IP-адресом и портом, которые он нам указал.
После того, как соединение для передачи данных установлено, сервер сообщает нам об этом в управляющем соединении. 150 Opening BINARY mode data connection for /pud/tex/latex/llncs2e.zip (230229 bytes). Также сервер говорит, что передача данных ведется в бинарном режиме.
После того, как передача файла закончена, сервер сообщает нам об этом 226 Transfer complete. Клиент выдает команду QUIT чтобы разорвать соединение. Сервер сообщает нам некоторую статистику, сколько было передано байт и файлов. 221 You have transferred 239229 bytes in 1 file. И говорит до свидания 221 Goodbye. На этом сеанс работы по протоколу FTP завершен.
Заключение
Протокол FTP используется для передачи файлов. Многие хостинговые компании используют протокол FTP для загрузки файлов на веб-сервер, которые потом передаются по протоколу HTTP.
Протокол FTP использует два соединения управляющее соединение и соединение для передачи данных. Использование отдельного соединения для передачи данных, приводят к проблемам в работе FTP с межсетевыми экранами и устройствами NAT. Для решения этой проблемы был придуман пассивный режим FTP при котором соединение для передачи данных устанавливается со стороны клиента. Еще одна проблема низкая безопасность.
Сейчас все чаще вместо FTP используются протоколы на основе SSH.