FTP должен умереть!

Протокол передачи файлов (FTP) причислен к стандарту RFC 959, принятому в октябре 1985 года.

Целью данной спецификации является удовлетворение различных нужд пользователей макси-хостов, мини-хостов, персональных терминалов, а также КДТ (в оригинале TACs - прим. ред.) с помощью простого и легкого в исполнении протокола.

Это взято из Вступления. Кто-нибудь знает, что за КДТ (TAC)? Я нет. Пришлось поискать, так как даже RFC не расшифровывает этот акроним. Лишь с третьего запроса в Google я наконец-то нашёл какой-то странный мануал Cisco IOS, где было написано, что это протокол Контроля Доступа Терминалов к сети (Terminal Access Control protocol). Что бы это ни значило.

Почти. На этом сайте указывается:

Лишь только "КДТ" может использоваться для определения BBN

 

Контроллер Доступа Терминалов к сети... Ну и что за BBN? Bolt Beranek and Newman? (BBN обычно означает Bulletin Board Network/электронная доска объявлений).

Это и будет являться Контроллером Доступа Терминалов к сети, частью аппаратного обеспечения, сконструированного Bolt Beranek and Newman (сейчас именуемые BBN), которая подсоединяет простые терминалы к сети ARPANET-сети управления перспективных исследовательских программ.

Если то, что RFC уже более 20 лет, не говорит вам о том, насколько стар данный протокол, то этот акроним наверняка заставит задуматься.

Но было бы скучно и глупо разглагольствовать лишь о возрасте протокола - в конце концов, я его старше (хоть и не намного, если брать 1971 год за отправную точку).

Нет, у меня есть более серьёзные причины для унижения FTP.


1. Да, давайте искажать исходную информацию!

Первой и самой главной причиной является не то, что протокол сам по себе дефектный, а то, что это проявляется уже при реализации самых простых действий.

3.1.1.1. Код ASCII

Данный код является стандартным и должен быть использован во всех реализациях FTP. Это касается в первую очередь передачи текстовых файлов, за исключением тех случаев, когда оба компьютера/хоста посчитают код EDCDIC более подходящим.

Нет никакого разумного оправдания для передачи всех файлов в формате ASCII без учёта их содержимого! Умное исполнение переключится в режим автоматического распознавания и будет использовать режим ASCII для передачи простых текстовых файлов и режим IMAGE для остальных файлов (FTP клиент в любом случае должен прочесть его, так что он как минимум на него посмотрит). Пользователь может сам выбрать режим ASCII либо IMAGE перед передачей файлов во избежание автоматической догадки.

Нет никакого разумного оправдания для передачи всех файлов в формате ASCII без учёта их содержимого!

Однако вместо этого, целые поколения исполнений командных строк FTP клиентов от Unix и Microsoft используют режим ASCII по умолчанию даже для тех файлов, которые при конечной конверсии будут повреждены.


2. Клиент должен прислушиваться к соединениям сервера!

Это одно из наиболее удивительных свойств, с которыми мне когда-либо приходилось сталкиваться. Обычно, в модели типа "клиент-сервер", сервер ждёт запросов от клиента. Однако в ФТП не существует чёткого разграничения между клиентом и сервером. Даже в RFC понятие "клиент" не используется. В буквальном смысле. Если вы начнёте искать слово "клиент" в RFC, вы его там не найдёте!

В ФТП не существует чёткого разграничения между клиентом и сервером.

RFC не предоставляет чёткого языка, описывающего данный процесс. Он никогда прямым текстом не скажет "клиент выберет произвольный порт, прослушает его, а затем отошлёт следующие байты серверу, который впоследствии подсоединится к порту клиента". (Очевидно, из-за такого рода доходчивости изложения документ бы не допустили к публикации) Как бы то ни было, таков "активный режим" FTP.

Данный протокол также позволяет клиенту выбрать "пассивный" (PASV) режим, при котором сервер несет ответственность за определение порта и передачу информации клиенту, который затем инициирует второе соединение для собственно передачи файла.


3. Брандмауэр? Что ещё за брандмауэр?

Протокол передачи файлов появился ещё до практического использования (и, вероятно, даже создания) таких концептов, как трансляция сетевых адресов (протокол NAT) и брандмауэры. Всё восходит к более простым временам, когда все компьютеры в Интернете были одинаковыми участниками сети, и не было веских причин ожидать от кого-либо злых намерений.

Однако в 21-м веке большинство конечных пользовательских машин используют немаршрутизируемые IPv4 адреса, и не только из-за широкого распространения брандмауэров, но и из-за простой нехватки IPv4 адресов в большинстве стран мира за пределами США.

Что случается, когда IP адрес клиента немаршрутизированный? В случае с моим собственным Debian, мой IP адрес 192.168.2.5. Это не настоящий Интернет-адрес - это один из зарегистрированных личных IP адресов, и я подключаюсь к Интернету через NAT-шлюз, который также служит в качестве брандмауэра.

Если же я буду использовать активный режим FTP для подключения своего компьютера к Интернет-хосту через простой протокол NAT, а затем попытаюсь передать файл, то таким образом я говорю FTP-серверу подключить меня к IP-адресу 192.168.2.5 порт X,Y. Так не пойдёт!

Следовательно, хорошо, что мы используем пассивный режим, правда? Клиент с NAT-протоколом может сообщить серверу, чтобы тот выбрал любой порт, прослушал его и сообщил о нём клиенту. Затем клиент может сделать повторное подключение, которое NAT выполнит должным образом.

Вот так. Только если на сервере тоже не стоит брандмауэр.


4. Вы тоже используете брандмауэр? Вот чёрт!

Сейчас очень редко можно столкнуться с ситуацией, когда сервер подключён к Интернету без какого-либо брандмауэра. Во многих случаях данным брандмауэром может служить NAT-шлюз. FTP-сервер может иметь протокол NAT, а стандартные протоколы FTP и порты данных (21 и 20 порты TCP) будут направляться (перенаправляться) брандмауэром на FTP-сервер.

Когда FTP-клиент с активным режимом соединяется с сервером, использующим протокол NAT, всё работает как надо. Клиент выбирает случайный порт, прослушивает его и говорит серверу "подсоедини меня к IP адресу 200,201,202,203 порт/PORT 204,205". Сервер может это сделать; NAT хорошо с этим справляется.

Но если к серверу с протоколом NAT подсоединяется FTP-клиент в пассивном режиме, возникают проблемы! Сервер выбирает случайный порт и говорит клиенту "подсоедини меня к IP-адресу 10,11,12,13 порт 14,15". Но, увы, IP адрес сервера немаршрутизируемый! Клиент не может соединиться с данным IP-адресом.

Очевидно, если и клиент, и сервер используют NAT-протокол, они не смогут установить FTP-соединение друг с другом, независимо от того, в каком режиме они работают (активный либо пассивный). И ни один из них работать не будет!

Если и клиент, и сервер используют NAT-протокол, они не смогут установить FTP-соединение друг с другом.


5. Какой у тебя пароль? xyzzy? Замечательно!

Как уже ранее говорилось, FTP появился ещё в те времена, когда Интернет считался безопасным местом, так что у него не было средств для защиты против кражи паролей, атак злоумышленников и т.п.

Ваше имя пользователя и пароль передаются в незашифрованном виде FTP-серверу от FTP-клиента. Любой, кто имеет доступ к какому-либо маршрутизатору, находящемуся между клиентом и сервером, может прочесть всю информацию, в том числе и ваш пароль.

Ваше имя пользователя и пароль передаются в незашифрованном виде FTP-серверу от FTP-клиента.

Значит, можно провести SSL-сессию втайне, да? Можно просто использовать stunnel для зашифровки всей информации, верно? Что ж, наполовину это так. Помните, что FTP не просто использует единичное соединение клиента с сервером и передаёт информацию в сжатом виде через этот открытый канал. Он открывает новый канал для каждой единичной передачи данных, даже для перечня файлов каталога. Так что если во время передачи управляющее FTP-соединение может работать, и может защитить имя пользователя и пароль от посторонних глаз, информационное соединение всё равно будет незащищённым.

Установка SSL-канала потребовала бы специальных мер как от клиента, так и от сервера. Это был бы полуфункционирующий, созданный из того, что было, способ, намного уступающий методам передачи данных, которые были разработаны в течение двух десятилетий после публикации спецификации FTP.

Если же защита личных данных хоть чуть-чуть вас волнует, то для передачи файлов вы будете пользоваться SCP, а не FTP.


6. Как же мне нравится ждать завершения 10 операций для того, чтобы получить всего один файл!

Для получения одного файла, FTP сервер совершает несчётное количество двухсторонних действий с подтверждением.

  1. Клиент создаёт TCP сокет-соединение к контрольному порту FTP-сервера и ждёт TCP-подтверждения.
  2. Клиент ожидает отсылки сервером "баннера".
  3. Клиент посылает серверу имя пользователя и ждёт его ответа.
  4. Клиент посылает серверу пароль и ждёт его ответа.
  5. Клиент посылает серверу команду SYST и ждёт его ответа.
  6. Клиент посылает серверу команду TYPE I и ждёт его ответа (Это может осуществляться позже, но это должно быть сделано.)
  7. Если пользователю нужно изменить директории на сервере, клиент посылает ещё одну команду серверу и ждёт его ответа.
  8. (В активном режиме) Клиент посылает серверу команду PORT и ждёт его ответа. В пассивном режиме это будет происходить в обратном направлении, однако это всё ещё один круг.
  9. Устанавливается соединение для передачи данных (совершенно новое TCP сокет-соединение с тремя полными двухсторонними подтверждениями).
  10. По информационному соединению передаются байты информации.
  11. Клиент ждёт отсылки сервером 2хх сообщения через управляющее соединение для подтверждения успешного завершения передачи.
  12. Клиент посылает серверу команду QUIT и ждёт завершения работы сервера.

Это десять полных двухсторонних процессов для передачи одного файла, и это если считать TCP сокет-соединения за один процесс! (На деле они намного запутаннее.)

А теперь давайте посмотрим, как это будет выглядеть в случае с HTTP:

  1. HTTP клиент устанавливает TCP сокет-соединение с HTTP-сервером.
  2. HTTP-клиент отсылает HTTP-серверу команду GET, включая URL, версию HTTP-протокола, виртуальное имя хоста, а также различные дополнительные данные, все сразу, и ждёт ответа от сервера.
  3. Третьего шага нету. Ответ, который мы получили, содержит в себе целый поток данных. Дело сделано!

Получается два двухсторонних процесса (считая TCP сокет за один). Путём несложных математических подсчётов можно сделать вывод, что при передаче файла HTTP в пять раз эффективнее, чем FTP.

При передаче файла HTTP в пять раз эффективнее, чем FTP.


7. В заключение

FTP является устаревшим, незащищённым, медленным и недружелюбным подобием протокола. Ему нет места в Интернете 21 века.

FTP ДОЛЖЕН УМЕРЕТЬ!

GreyCat

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Читайте также

 

Комментарии

Страницы

Аватар пользователя mike

Холивар FTP vs HTTP существует давно. Редакция! Нечего лабуду перепечатывать! FTP отомрёт, когда надо будет.

Ну почему лабуда? Можно соглашаться или не соглашаться с аргументами, а просто написать "лабуда" - извините, mike, но был о Вас лучшего мнения.

Аватар пользователя mike

Извините, mike, но был о Вас лучшего мнения.

Не извиняю, т.к. ПЕРЕПЕЧАТЫВАТЬ ПРОСТО; таких некритических перепечаток могу обеспечить воз и малую тележку, надо только, чтобы кто-то стучал по клаве, надиктую по-русски.  Да, не лабуда, а хуже лабуды: "кот" вводит неискушённых читателей в заблуждение, говоря ТОЛЬКО о недостатках. В то же время команды FTP имеют значительно! меньший размер, чем HTTP-запросы, о чём "серый кот" умалчивает. Выложите файлы на FTP и смотрите логи сервера, к чему больше обращаются - к Web-страницам или к файлам, а также посмотрите, как растёт аутгоуинг трафик, за который надо платить. FTP преимущественно для публичных серверов, где и речи нет о шифрации хранимых файлов, о чём "кот" тоже умалчивает,  Есть и др. достоинства FTP, но не хочу  холиварить.

mike, это одна из точек зрения. Вы с ней не согласились, и это хорошо, в споре рождается истина. Перепечатывать просто? Это перевод, а не копипаста, прошу заметить.

Аватар пользователя mike

>Это перевод, а не копипаста

Простой перевод IT-контента -- та же копипаста. Др. дело авторизованный перевод с критическим осмыслением. А его-то и не было.

>>BBN обычно означает Bulletin Board Network/электронная доска объявлений

че за фигня? электронной доской объявлений все время была BBS - Bulletin Board SYSTEM. СИСТЕМА(!) но никак не сеть.

Аватар пользователя Enki

FTP является устаревшим, незащищённым, медленным и недружелюбным подобием протокола. Ему нет места в Интернете 21 века.
FTP ДОЛЖЕН УМЕРЕТЬ! 

Автор хоть раз пользовался FTP или только читал теорию?! 

  1. устаревшим. Возможно и устарел. Автор, вы можете предложить современную альтернативу?
  2. незащищённым. Автор погуглите о SFTP.
  3. медленным. Медленный по сравнению с чем?
  4. недружелюбным подобием протокола А какой протокол дружелюбный?
Аватар пользователя Enki

Если и клиент, и сервер используют NAT-протокол, они не смогут установить FTP-соединение друг с другом.

Смогут, надо только на стороне сервера настроить Port Forwarding (проброс портов) и клиент сможет подключится к FTP.

Аватар пользователя mike

Видимо, переводил журналист, который и с FTP-сервером-то не работал, привыкший сёрфить через  HTTP. Пусть он зайдёт на FTP-сервер БТК и подумает, во что бы вылился труд, по выкладке тонн каталогов софта без FTP. Заодно пусть подумает, зачем коммандерам FTP-клиент. :)))

З.Ы. Все ОС имеют FTP-клиента в командной строке, FTP-сервер развёртывается в считанные минуты, да и работает быстрее веб-сервера.

Аватар пользователя Enki

КВ скатывается до бездумной копипасты. Всё это из-за отсутствия авторов. Frown

Страницы