HTTP против FTP

HTTP vs FTP

Эта статья — попытка описать основные различия между известными протоколами обмена данными FTP и HTTP.

Мы активно используем оба протокола в нашем основном продукте — корпоративном мессенджере MyChat уже много лет, и за это время столкнулись со многими заблуждениями и непониманием работы этих двух фундаментальных протоколов обмена файлами в Интернете.

Если вы увидите какие-то ошибки или неточности, напишите об этом на форуме.

Дисклэймер: в английском языке есть два термина: “upload” и “download”. В русском нет хороших аналогов, поэтому для файлов, которые мы отдаём с клиента на сервер, применяем слово “заливать” (upload), а для файлов, которые забираем на клиент с сервера — используем слово “скачивать” (“download”).

Оба протокола используются для скачивания и заливки файлов в Интернете и локальных сетях. Для текста и бинарных данных. Оба протокола работают поверх TCP/IP. Но между ними есть несколько серьёзных различий.


Скорость передачи


Наверное, самый распространённый вопрос: что быстрее для передачи файлов, FTP или HTTP?

Что делает FTP быстрым?

  • в передаваемом потоке нет мета описаний, только чистые бинарные данные. Справочные данные идут в отдельном соединении;
  • нет накладных расходов по перекодировке передаваемых данных.

Что делает HTTP быстрым?

  • повторное использование существующих постоянных соединений повышает производительность TCP, не тратится время на создание новых соединений;
  • конвейерная обработка позволяет быстрее запрашивать несколько файлов с одного и того же сервера;
  • (автоматическое) сжатие трафика уменьшает объём передаваемых данных, это может увеличить скорость передачи при условии быстрых клиента и сервера и медленного канала связи;
  • нет управляющих команд в потоке передачи данных, это экономит время обработки.

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

Для одиночного файла небольшого размера и медленного соединения FTP покажет себя лучше. При получении нескольких файлов подряд (особенно небольших размеров) HTTP обычно показывает лучший результат.


Возраст


FTP (RFC959) появился за десять лет до того, как был придуман HTTP. В то время FTP был единственным протоколом в Интернете. Первые зачатки того, что впоследствии стало документом RFC959, можно найти в далёком 1971 году.


Заливка


Оба протокола умеют это делать. У FTP есть команда "append", HTTP исповедует подход "вот вам данные, а вы сами разбирайтесь, что с ними делать", то есть, никаких команд по управлению заливаемыми файлами нет.

Следует сказать, что существует протокол WebDAV, построенный поверх HTTP, который позволяет работать с файлами в традиционной манере, будто они находятся на вашем локальном устройстве.


Форматы ASCII, EBCDIC или бинарный


FTP имеет представление о формате файла, поэтому может передавать данные как в ASCII, так и в двоичном виде (raw bytes). HTTP же всегда отправляет файлы в двоичном виде. Таким образом, FTP умеет преобразовывать данные "на лету", если они передаются между системами с разными архитектурами (Windows/Linux/мэйнфрэймы).

Например, если отправитель использует одну схему для кодирования конца строки ("EOL" — End-Of-Line), а получатель — другую, то FTP сделает так, что они друг друга поймут. Unix использует только символ NL (newLine x0A), а MS Windows два символа подряд, CR и LF (CarriageReturn и LineFeed — x0D0A). EBCDIC перекодировки используются на старых мэйнфреймах.

HTTP, в противовес FTP, предоставляет метаданные для файлов, "Content-Type". Таким образом, метаданные могут использоваться клиентами для интерпретации содержимого.


Заголовки


Передача файлов через HTTP всегда включает в себя набор заголовков, в которых находятся метаданные. FTP никогда не передаёт никаких заголовков. В связи с этим, при передаче большого количества мелких файлов, их заголовки будут составлять значительную часть трафика. В заголовках HTTP находится информация о дате и времени модификации файлов, кодировке символов, имени сервера и его версии и т.п.


Пайплайны или конвейеры


HTTP поддерживает конвейерную обработку данных. Это означает, что клиент может запросить новую передачу файлов до того, как закончится предыдущая, что даёт возможность убрать задержки при закачке нескольких документов подряд. TCP пакеты, таким образом, будут оптимизированы для максимальной скорости передачи.

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


FTP команды/ответы


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


Два соединения


Одна из самых больших проблем для FTP в реальной работе — это использование двух соединений. Первое — для отправки управляющих команд, а второе — для передачи содержимого файла. Для этой цели он каждый раз открывает отдельный поток TCP. Если вы передаёте 100 файлов, по очереди будут открыты и закрыты 100 TCP соединений.


Файрволы и NAT


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

Это также означает, что если обе стороны соединения находятся за NAT, вы, скорее всего, не сможете пользоваться FTP.

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

Чтобы такого не происходило, приходится время от времени отправлять фиктивные пустые команды, чтобы соединение поддерживалось в "живом" состоянии. Результат — небольшой, но лишний трафик.


Активный и пассивный режимы


FTP открывает второе соединение в активном или пассивном режиме. Если работает активный режим (соединение инициирует сервер) — будут проблемы с соединением в сложных сетях, потому что такое соединение невозможно через NAT. Поэтому, в большинстве случаев используется пассивный режим (passive mode), когда соединение происходит только со стороны клиента.


Зашифрованные управляющие соединения


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

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


Схемы авторизации


У FTP и HTTP есть несколько документированных методов аутентификации. Оба протокола предлагают базовую аутентификацию обычным текстом (логин/пароль). Однако, для HTTP существуют несколько часто используемых методов проверки, которые не отправляют пароль в виде обычного текста, в отличие от FTP.


Скачивание


Оба протокола умеют это делать. У обоих протоколов были проблемы при скачивании файлов с размером, больше чем 2 гигабайта, но это уже в прошлом. В современных клиентах и серверах, на современных операционных системах этой проблемы больше нет.


Диапазоны/возобновление скачивания


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

В противовес FTP, HTTP поддерживает более продвинутые диапазоны для скачивания.

Также у FTP есть проблемы при возобновлении соединений при заливке или скачивании файлов, начиная с сегмента, большего, чем 2 GB.


Постоянные соединения


HTTP клиент может держать одно постоянное соединение с сервером для любого количества передач файлов.

FTP должен создавать новое соединение для каждой новой передачи. Многократные выполнения новых подключений плохо сказываются на производительности из-за необходимости "рукопожатий" (handshakes) для TCP соединений.


Кодирование HTTP-чанков


Во избежание закрытия соединения, когда у вас нет возможности сообщить удалённой стороне о том, что передача файла уже завершена, в HTTP было введено так называемое кодирование передаваемых блоков (чанков) с данными.

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

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


Сжатие


HTTP предоставляет серверу и клиенту возможность договориться и выбрать один из алгоритмов сжатия. Алгоритм gzip является, пожалуй, наиболее широко используемым. Есть более современный brotli, но он ещё не полностью поддерживается разными серверами и клиентами, хотя даёт лучшее сжатие (до +20%), особенно на текстовых html, javascript и css файлах.

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


FXP


FTP поддерживает технологию для передачи данных с одного сервера на другой, как будто бы передачу ведет непосредственно сам клиент. Однако на большинстве серверов эта возможность закрыта из-за проблем с безопасностью, так как протокол FXP был недостаточно хорошо спроектирован.


IPv6


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


Виртуальный хостинг на основе имени


Используя HTTP 1.1, вы легко можете разместить множество сайтов на одном сервере, и все они будут различаться по их именам.

В FTP вы вообще не можете использовать виртуальный хостинг на основе имён, пока команда HOST не будет реализована на сервере, с которым вы соединены. Это свежая спецификация, и она ещё мало распространена.


Просмотр каталогов


В FTP можно получить список файлов из папки на удалённом сервере, не скачивая их, в то время как в HTTP нет такой возможности.

Однако, в силу того, что авторы спецификации FTP жили в разное время, команды для получения списка файлов в каталоге (LIST и NLST) не имеют чётко описанного формата вывода. Поэтому авторам FTP клиентов приходится заниматься написание синтаксических анализаторов текста, чтобы попытаться правильно угадать, что за данные им передаёт сервер. Более поздние спецификации (RFC3659) предусматривают новые команды типа MLSD, но они ещё не получили широкого распространения и плохо поддерживаются разными серверами и клиентами.

Списки файлов в каталогах через HTTP обычно передаются текстом в HTML формате, либо с помощью WebDAV, который работает поверх HTTP.


Поддержка прокси


Одно из серьёзных преимуществ HTTP перед FTP — это поддержка прокси, встроенная в него с самого начала. Технология отлажена и очень хорошо работает. Многие протоколы могут быть инкапсулированы внутрь HTTP, как в своеобразный "конверт" для прохождения прокси-серверов.

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

Служба поддержки