TFTP (англ. Trivial File Transfer Protocol — простой протокол передачи файлов) используется главным образом для первоначальной загрузки бездисковых рабочих станций. TFTP, в отличие от FTP, не содержит возможностей аутентификации (хотя возможна фильтрация по IP-адресу) и основан на транспортном протоколе UDP.

TFTP
Название Trivial File Transfer Protocol
Уровень (по модели OSI) Прикладной
Семейство UDP/IP
Создан в ~ 1980
Порт/ID 69/UDP
Назначение протокола Передача файлов
Спецификация RFC 1350 / STD 33
Основные реализации (клиенты) RIS Windows, tftp.exe
Основные реализации (серверы) WinAgents TFTP Server, RIS Windows, tftpd
Расширяемость Опции (RFC 2347)
Основные расширения Размер блока (RFC 2348), Тайм-аут передачи (RFC 2349)

Применение

править

Основное назначение TFTP — обеспечение простоты реализации клиента. В связи с этим он используется для загрузки бездисковых рабочих станций, загрузки обновлений и конфигураций в «умные» сетевые устройства, записи статистики с мини-АТС (CDR) и аппаратных маршрутизаторов/файрволов.[источник не указан 158 дней]

TFTP наряду с HTTP используется для программирования микроконтроллеров методом In-Application Programming (IAP) через интерфейс Ethernet[1].

Безопасность

править

Поскольку протокол не поддерживает аутентификации, единственный метод идентификации клиента — это его сетевой адрес (который может быть подделан). Обычно в Unix-системах tftpd доступен только каталог /tftpboot. Однако в старых TFTP-серверах было возможным получить файл паролей командой RRQ ../etc/passwd.

Демон tftpd (одна из реализаций tftp-сервера) отказывается обрабатывать файлы, содержащие в своём имени комбинацию «/../» или начинающуюся с «../». Запись разрешается только в файлы, которые уже существуют (любого размера, например нулевого), и доступны для публичной записи (права доступа: -rw-rw-rw-)[2].

Дополнительная защита от доступа к произвольным файлам осуществляется с помощью смены корневого каталога на каталог tftpd (обычно /usr/TFTPRoot).

Типы пакета

править

В протоколе TFTP предусмотрены 4 вида пакетов, кодируемые пятью кодами операции (англ. opcode). Для кода операции зарезервированы два первых байта в пакете[3]:

  • RRQ/WRQ packet — пакет запроса чтения (Read request; opcode 1) или записи (Write request; opcode 2);
  • Data packet — пакет с данными (opcode 3);
  • ACK packet — пакет подтверждения (Acknowledgment; opcode 4);
  • Error packet — пакет с сообщением об ошибке (opcode 5).

Запросы на чтение и запись

править

Для начала передачи данных клиент должен послать серверу WRQ или RRQ-пакет. У обоих пакетов формат одинаковый:

0x01/0x02 (тип пакета) Имя файла 0x00 (конец строки) Режим передачи 0x00 (конец строки) Опции… (если есть)
2 байта строка в ASCII 1 байт строка в ASCII 1 байт См. «Опции»

В TFTP существует 2 режима передачи (режим Mail, определенный в IEN 133, признан устаревшим):

  • netascii — файл перед передачей перекодируется в ASCII.
  • octet — файл передается без изменений.

После получения RRQ-пакета сервером, он сразу начинает передачу данных. В случае с WRQ-запросом — сервер должен прислать ACK-пакет c номером пакета 0.

Процесс передачи данных

править

После получения запроса RRQ сервер сразу посылает в качестве подтверждения пакет с данными и с ID пакета, равным единице. В WRQ в качестве подтверждения используется ACK с ID, равным нулю. Всего по TFTP можно передать 32 МБ (65536 * 512 / 1024²), однако, из-за использования знакового int вместо беззнакового, размер подтверждения ограничен 16 мегабайтами. Однако если клиент и сервер поддерживают расширения протокола RFC 2347 и RFC 2348, то максимальный размер передаваемого файла увеличивается до 4 ГБ.

Опции TFTP

править

В RFC 2347 был предусмотрен формат опций, которые можно присоединять к окончанию RRQ-пакета и WRQ-пакета:

Код опции 0x00 (конец строки) Значение опции 0x00 (конец строки)
строка в ASCII 1 байт строка в ASCII 1 байт

Опций может быть несколько. Тогда они будут следовать друг за другом. Порядок опций не важен.

В ответ на RRQ (или WRQ) с опциями, сервер должен прислать OACK со списком опций, которые сервер принял. Наиболее распространённые опции:

Название Определена в Код опции
Размер блока RFC 2348 blksize В качестве значения опции идёт число, принимающее значение от 8 до 65464, обозначающее размер блока.
Интервал повторной передачи (Timeout) RFC 2349 timeout В качестве значения опции идёт число, принимающее значение от 1 до 255, обозначающее время ожидания перед повторной передачей блока в секундах.
Размер файла RFC 2349 tsize В качестве значения опции идёт число, обозначающее размер передаваемого файла в байтах.

Ошибки

править

В TFTP информация об ошибке имеет следующий формат:

0x05 (тип пакета) Код ошибки Описание ошибки 0x00 (конец строки)
2 байта 2 байта строка в ASCII 1 байт

Код ошибки может принимать одно из значений, перечисленных в STD 33 (за исключением кода 8 — он описан в RFC 2347). Вот они:

Код ошибки Описание
0 Нет определенного кода, см. текст ошибки
1 Файл не найден
2 Доступ запрещен
3 Невозможно выделить место на диске
4 Некорректная TFTP-операция
5 Неправильный Transfer ID
6 Файл уже существует
7 Пользователь не существует
8 Неправильная опция

Схема URI

править

В RFC 3617 определен формат URI для TFTP. Он имеет следующий вид:

tftp://[узел назначения]/[нужный файл];mode=[режим передачи]

Например:

tftp://example.com/todo.txt;mode=netascii

Стандарты

править

См. также

править

Примечания

править
  1. AN3226, 2010, Introduction, p. 1.
  2. страницы документации man tftpd из состава FreeBSD 4.9
  3. AN3226, 2010, 2.1 TFTP Overview, p. 5.

Литература

править
  • Стивенс, У. Р. Гл. 15. Простейший протокол передачи файлов TFTP // Протоколы TCP/IP : Практическое руководство. — ISBN 5-7940-0093-7.
  • Остерлох, Х. Гл. 16. Простейший протокол передачи файлов (TFTP) // TCP/IP : Семейство протоколов передачи данных в сетях компьютеров. — ISBN 5-93772-039-3.
  • AN3226 : STM32F107 In-Application Programming (IAP) over Ethernet : Application note : [англ.] : [арх. 22 сентября 2021]. — STMicroelectronics, 2010. — 18 p.
  • Sollins, K. R. The TFTP Protocol : [англ.] : [арх. 2 июля 2014]. — 1980. — 29 January.

Ссылки

править