Введение
Очень базовый протокол передачи данных по UDP.
Протокол тривиальной передачи файлов (TFTP) — это простой протокол передачи файлов, работающий в режиме «шаг за шагом», который позволяет клиенту получать файл с удалённого хоста или передавать файл на удалённый хост. Одно из основных его применений — на начальных этапах загрузки узлов из локальной сети. TFTP используется для этой задачи благодаря своей простоте реализации. TFTP был впервые стандартизирован в 1981 году, а текущую спецификацию протокола можно найти в .
Обзор
Благодаря своей простой конструкции, TFTP может быть легко реализован кодом с небольшим объемом памяти. Поэтому он является протоколом выбора для начальных этапов любой стратегии сетевой загрузки, такой как BOOTP, PXE, BSDP и т. д., при работе как с высокопроизводительными компьютерами, так и с маломощными одноплатными компьютерами (SBC) и системами на кристалле (SoC). Он также используется для передачи образов прошивки и файлов конфигурации на сетевые устройства, такие как маршрутизаторы, брандмауэры, IP-телефоны и т. д. В настоящее время TFTP практически не используется для передачи данных в Интернете. При разработке TFTP оказал влияние более ранний протокол EFTP, который входил в состав пакета протоколов PARC Universal Packet. TFTP был впервые определен в 1980 году в IEN 133. В июне 1981 года протокол TFTP (ревизия 2) был опубликован как RFC 783, а позднее обновлен в июле 1992 года RFC 1350, который, среди прочего, устранил проблему "синдрома ученика чародея". В марте 1995 года RFC 1782, посвященный расширению опций TFTP, был обновлен в мае 1998 года RFC 2347 и определил механизм согласования опций, который устанавливает основу для согласования опций передачи файлов перед передачей с использованием механизма, соответствующего первоначальной спецификации TFTP. TFTP – это простой протокол для передачи файлов, реализованный поверх протоколов UDP/IP с использованием известного порта 69. TFTP был разработан как компактный и простой в реализации, поэтому ему не хватает большинства расширенных функций, предлагаемых более надежными протоколами передачи файлов. TFTP может только читать и записывать файлы на удаленный сервер или с него. Он не поддерживает перечисление, удаление или переименование файлов и каталогов, а также не предусматривает аутентификацию пользователей. В настоящее время TFTP обычно используется только в локальных сетях (LAN).
Подробности
В TFTP передача инициируется клиентом, отправляющим запрос на чтение или запись определенного файла на сервере. Запрос может опционально включать набор согласованных параметров передачи, предложенных клиентом в соответствии с условиями, указанными в RFC 2347. Если сервер удовлетворяет запрос, файл отправляется блоками фиксированной длины 512 байт по умолчанию или в количестве, указанном в опции согласования размера блока, определенной RFC 2348. Каждый блок передаваемых данных, который обычно передается в рамках одного IP-пакета во избежание фрагментации IP, должен быть подтвержден пакетом подтверждения (ACK) перед отправкой следующего блока. Пакет данных размером менее 512 байт или согласованного размера блока сигнализирует об окончании передачи. Если пакет теряется в сети, предполагаемый получатель ожидает истечения времени ожидания и может повторно отправить свой последний пакет (который может содержать данные или подтверждение), что приведет к повторной отправке потерянного пакета отправителем. Отправитель должен хранить только один пакет для повторной отправки, поскольку подтверждение в режиме «шаг за шагом» гарантирует, что все предыдущие пакеты были успешно получены. Следует отметить, что оба устройства, участвующие в передаче, рассматриваются как отправители и получатели. Один отправляет данные и получает подтверждения, а другой отправляет подтверждения и получает данные. TFTP определяет три режима передачи: netascii, octet и mail. Netascii – это модифицированная форма ASCII, определенная в RFC 764. Она состоит из 8-битного расширения 7-битного пространства символов ASCII от 0x20 до 0x7F (печатные символы и пробел) и восьми управляющих символов. Допустимые управляющие символы включают нулевой (0x00), перевод строки (LF, 0x0A) и возврат каретки (CR, 0x0D). Netascii также требует, чтобы маркер конца строки на хосте был преобразован в пару символов CR LF для передачи, и чтобы за каждым CR следовал либо LF, либо нулевой символ. Режим octet позволяет передавать произвольные сырые 8-битные байты, при этом полученный файл будет идентичен отправленному байт в байт. В частности, если хост получает octet-файл и затем возвращает его, возвращенный файл должен быть идентичен исходному. Режим передачи почты использует передачу Netascii, но файл отправляется получателю электронной почты, указав адрес электронной почты этого получателя в качестве имени файла. RFC 1350 объявил этот режим передачи устаревшим. TFTP использует UDP в качестве транспортного протокола. Запрос на передачу всегда инициируется на порт 69, но порты передачи данных выбираются независимо отправителем и получателем во время инициализации передачи. Порты выбираются случайным образом в соответствии с параметрами сетевого стека, обычно из диапазона эфемерных портов. Инициирующий хост A отправляет пакет RRQ (запрос на чтение) или WRQ (запрос на запись) хосту S на номер порта 69, содержащий имя файла, режим передачи и, опционально, любые согласованные параметры в соответствии с условиями RFC 2347. S отвечает пакетом Option ACK, если использовались параметры, и пакетом ACK (подтверждение) на WRQ и непосредственно пакетом DATA на RRQ. Пакет отправляется с случайно выделенного эфемерного порта, и все последующие пакеты хосту S должны быть направлены на этот порт. Отправляющий хост отправляет нумерованные пакеты DATA на хост назначения, все, кроме последнего, содержащие блок данных полного размера (по умолчанию 512 байт). Хост назначения отвечает нумерованными пакетами ACK на все пакеты DATA. Последний пакет DATA должен содержать менее полного блока данных, чтобы сигнализировать о том, что он последний. Если размер передаваемого файла является точным кратным размеру блока, отправитель отправляет последний пакет DATA, содержащий 0 байт данных. Получатель отвечает на каждый пакет DATA соответствующим нумерованным ACK. Отправитель отвечает на первый полученный ACK блока пакетом DATA следующего блока. Если ACK не получен в конечном итоге, таймер повторной отправки повторно отправляет пакет DATA. TFTP исторически связан с сетевой загрузкой. Одной из первых попыток в этом направлении был стандарт загрузки Bootstrap с использованием TFTP RFC 906, опубликованный в 1984 году, который установил стандарт Trivial File Transfer Protocol RFC 783, опубликованный в 1981 году, в качестве стандартного протокола передачи файлов для загрузки Bootstrap. Вскоре после этого последовал стандарт протокола Bootstrap RFC 951 (BOOTP), опубликованный в 1985 году, который позволял клиентской машине без диска обнаруживать свой собственный IP-адрес, адрес сервера TFTP и имя сетевой программы загрузки (NBP) для передачи через TFTP, загрузки в память и выполнения. Стандарт протокола динамической конфигурации хоста RFC 2131 (DHCP), опубликованный в 1997 году, улучшил возможности BOOTP. Наконец, Preboot Execution Environment (PXE) версии 2.0 был выпущен в декабре 1998 года, а обновление 2.1 было опубликовано в сентябре 1999 года, используя TFTP в качестве протокола передачи файлов. Intel недавно решил широко поддерживать PXE в новой спецификации UEFI, расширив поддержку TFTP на все среды EFI/UEFI. Исходный протокол имеет ограничение на размер передаваемого файла 512 байт/блок x 65535 блоков = 32 МБ. В 1998 году это ограничение было увеличено до 65535 байт/блок x 65535 блоков = 4 ГБ с помощью опции размера блока TFTP RFC 2348. Если определенный размер блока приводит к размеру IP-пакета, превышающему минимальный MTU в любой точке сетевого пути, произойдет фрагментация и сборка IP, что не только добавит дополнительную нагрузку, но и приведет к полной неудаче передачи, когда минималистичная реализация стека IP в BOOTP или PXE ROM хоста не реализует (или не реализует должным образом) фрагментацию и сборку IP. Если пакеты TFTP должны соответствовать стандартному MTU Ethernet (1500), значение размера блока рассчитывается как 1500 минус заголовки TFTP (4 байта), UDP (8 байт) и IP (20 байт) = 1468 байт/блок, что дает предел 1468 байт/блок x 65535 блоков = 92 МБ. Сегодня большинство серверов и клиентов поддерживают перенос номера блока (счетчик блоков возвращается к 0 или 1 после 65535), что дает практически неограниченный размер передаваемого файла. Поскольку TFTP использует UDP, он должен обеспечивать собственную транспортную и сессионную поддержку. Каждый файл, передаваемый через TFTP, представляет собой независимый обмен. Традиционно эта передача выполняется в режиме «шаг за шагом», когда в сети одновременно находится только один пакет (блок данных или «подтверждение»). Благодаря этой стратегии с одним блоком данных, а не отправке большего количества непрерывных блоков данных перед приостановкой передачи для ожидания соответствующего подтверждения (windowing), TFTP обеспечивает низкую пропускную способность, особенно по каналам связи с высокой задержкой. Microsoft представила TFTP с окнами в Windows 2008 как часть Windows Deployment Services (WDS), в январе 2015 года была опубликована опция размера окна TFTP RFC 7440. Это значительно повышает производительность для таких задач, как загрузка PXE, без побочного эффекта фрагментации IP, иногда наблюдаемого в опции размера блока RFC 2348.
Относительно безопасности
TFTP не предусматривает механизмов аутентификации или контроля доступа. При использовании TFTP для передачи файлов, когда требуется аутентификация, контроль доступа, конфиденциальность или проверка целостности, необходимо соблюдать осторожность. Следует учитывать, что эти функции безопасности могут быть реализованы на более высоком или низком уровне, чем уровень, на котором работает TFTP. Также необходимо тщательно настраивать права процесса TFTP-сервера, чтобы не скомпрометировать безопасность файловой системы сервера. TFTP часто устанавливается с ограничениями, допускающими доступ только к файлам, имеющим публичные права на чтение. Как правило, TFTP не поддерживает просмотр содержимого каталогов, удаление, переименование и запись файлов. Передача файлов по TFTP не рекомендуется в случаях, когда присущие протоколу ограничения могут повлечь за собой серьезную юридическую ответственность.
Документация стандартов IETF
RFC Номер Название Опубликованный Автор Устаревшая и информация об обновлениях Протокол TFTP (Ревизия 1) Июнь 1981K. Sollins Загрузка с помощью TFTP Июнь 1984Ross Finlayson Протокол загрузки Сентябрь 1985Bill CroftОбновлено в Протоколе TFTP (Ревизия 2) Июль 1992K. SollinsОбновлено в TFTP Option Extension Март 1995G. Malkin Протокол динамической конфигурации хоста Март 1997R. DromsОбновлено в TFTP Option Extension Май 1998G. Malkin TFTP Опция размера блока Май 1998G. Malkin TFTP Опции интервала времени ожидания и размера передачи Май 1998G. Malkin Принципы конфигурации интернет-хоста Май 2009B. Aboba TFTP Опция размера окна Январь 2015P. Masotta