Binkp

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
binkp
Уровень (по модели OSI) Прикладной
Семейство TCP/IP
Создан в 1996
Порт/ID 24554/TCP
Назначение протокола Передача файлов в FTN-сетях
Спецификация FTS-1026
Основные реализации (клиенты) binkd, argus, bforce
Расширяемость Доп. команды и опции
Основные расширения шифрование, сжатие данных, nodupe mode, MD5-аутентификация

Binkp — сетевой протокол прикладного уровня, разработанный для передачи файлов в Фидонете или в других FTN-сетях, происходящей поверх TCP-соединения. Как правило, для связи по данному протоколу используют TCP-порт 24554, так как этот номер зарезервирован под binkp в каталоге IANA (Internet Assigned Numbers Authority).

Существуют две версии протокола binkp: оригинальная (1.0) и дополненная (1.1). Кроме того, разработано несколько расширений протокола. Протокол и бо́льшая часть его расширений оформлены стандартами и предложениями FTSC.

Уровень разрешает приложениям пользователя иметь доступ к сетевым службам, таким как обработчик запросов к базам данных, доступ к файлам, пересылке электронной почты. Также отвечает за передачу служебной информации, предоставляет приложениям информацию об ошибках и формирует запросы к уровню представления. Пример: HTTP, POP3, SMTP.

История создания[править | править код]

После того, как Интернет стал все более распространён и доступен, возникла потребность использовать его для междугородних линков в Фидонет вместо обычных телефонных сетей и сети Искра-2. Реализации виртуальных модемов (rlfossil, vmodem) решали задачу недостаточно эффективно. В мейлере ifcico была реализована возможность прямой связи между фидошными мейлерами по TCP, но по-прежнему использовались протоколы, предназначенные для не дающего гарантии доставки транспорта (EMSI, zmodem), а потому неэффективные для применения поверх TCP.

В такой ситуации в 1996 г. Дмитрий Малов разработал специализированный протокол binkp и поддерживающий его мейлер binkd. Этот протокол и мейлер могли работать только поверх TCP, они не предназначены для работы по обычным телефонным линиям. В этом было их преимущество перед остальными протоколами, и binkp достаточно быстро потеснил остальные варианты fido over inet: к концу 1998 года, если судить по флагам в нодлисте, binkp уже был наиболее распространённым из протоколов fido over ip. Кроме того, протокол binkp был изначально документирован, а его реализация (binkd) — свободная кроссплатформенная программа, что тоже являлось существенным преимуществом binkp и binkd перед другими протоколами этого применения. Впоследствии появились реализации протокола binkp и в других мейлерах (Argus, bforce, qico, mbico).

Номер порта (24554) был, как утверждает автор, номером его домашнего телефона в Магадане.[1]

Структура протокола[править | править код]

Взаимодействие происходит в одной TCP-сессии (благодаря чему протокол работает через IP NAT). Стороны обмениваются между собой кадрами ограниченного размера (не более 32K, по умолчанию 4K). В каждом кадре могут передаваться либо данные, либо управляющая команда. За счёт этого достигается двунаправленность протокола: во время отправки файла одна из сторон может вклинить в поток данных кадр с командой подтверждения приёма файла, таким образом приём и передача происходят практически независимо друг от друга одновременно в одной tcp-сессии.

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

Binkp работает через двунаправленный символьный канал, не допускающий ошибок при передаче данных. Любые данные, записываемые каждой из сторон в канал, имеют следующий общий формат:

binkp кадр:

   +---------------------- 0=блок данных, 1=сообщение(команда)
   |                +---- размер блока данных / размер аргументов
   |                |
   7 6543210 76543210
  +-+-------+--------+--- ..... ---+
  | |   HI      LO   |             | -- блок данных / аргументы
  +-+-------+--------+--- ..... ---+
  |<-    2 байта   ->|<- 32K max ->|

Заголовок кадра — два байта, определяющие тип и длину (в байтах) данных, следующих за заголовком. Если старший бит заголовка сброшен, то все данные поступившие с кадром следует дописать к текущему принимаемому файлу. (Если такой файл уже открыт, иначе — отбросить) В противном случае, данные следует разобрать как команду, меняющую состояние протокола. Первый байт данных, поступивших с кадром — номер команды. Оставшиеся — аргумент. Аргументы команд — произвольный набор символов, не обязательно ограниченный '\0'. Команда без аругментов (например, M_OK) может выглядеть примерно так:

   7 6543210 76543210 76543210
  +-+-------+--------+--------+
  |1|      0        1|       4|
  +-+-------+--------+--------+
    |                |        +----- номер команды (аргументов нет)
   |                 +-------- длина кадра без заголовка -- 1 байт
   +- это команда

Основные расширения[править | править код]

По мере развития протокола в него были добавлены многие новые возможности. Вот основные из них:

  • Возможность дополнения очереди на отправку без обрыва соединения (это основное отличие binkp 1.1 от 1.0), в частности, возможность отработки файловых запросов
  • Возможность безопасной передачи пароля по открытым каналам связи с использованием хеша MD5
  • Возможность шифрования всего трафика
  • Возможность компрессии трафика
  • Защита от повторной передачи файла в случае обрыва связи при подтверждении приёма (ND-mode)

См. также[править | править код]

Примечания[править | править код]

  1. Dmitry Malov. Каждый раз, когда читаю в путеводителе или... Москва: Facebook (7 октября 2016). — «на самом деле, 24554 был номер моего домашнего телефона в Магадане». Архивировано из оригинала 7 октября 2016 года.

Ссылки[править | править код]