Этот перевод был создан с помощью машинного обучения и может быть не на 100% точным. Просмотреть английскую версию

BOB - Basic Open Bridge

Устаревший API для управления назначениями

Предупреждение - Устарело

Не предназначен для использования новыми приложениями. BOB, как указано здесь, поддерживает только тип подписи DSA-SHA1. BOB не будет расширен для поддержки новых типов подписей или других расширенных функций. Новые приложения должны использовать SAM V3 .

Поддержка BOB была удалена из новых установок Java I2P начиная с версии 1.7.0 (2022-02). Она по-прежнему будет работать в Java I2P, изначально установленном как версия 1.6.1 или более ранняя, даже после обновлений, но она не поддерживается и может перестать работать в любой момент. BOB по-прежнему поддерживается i2pd по состоянию на 2025-05, но приложения всё равно должны перейти на SAMv3 по причинам, указанным выше. См. документацию i2pd для любых расширений API, задокументированного здесь, которые поддерживаются i2pd.

На данный момент большинство хороших идей из BOB были включены в SAMv3, который имеет больше функций и более широкое практическое применение. BOB может всё ещё работать на некоторых установках (см. выше), но он не получает передовых функций, доступных для SAMv3, и по сути не поддерживается, за исключением i2pd.

Языковые библиотеки для BOB API

Обзор

KEYS = пара ключей открытый+закрытый, они в формате BASE64

KEY = публичный ключ, также BASE64

ERROR как следует из названия возвращает сообщение "ERROR "+DESCRIPTION+"\n", где DESCRIPTION — это описание того, что пошло не так.

OK возвращает "OK", и если должны быть возвращены данные, они находятся на той же строке. OK означает, что команда завершена.

Строки DATA содержат информацию, которую вы запросили. Может быть несколько строк DATA на один запрос.

ПРИМЕЧАНИЕ: Команда help является ЕДИНСТВЕННОЙ командой, которая составляет исключение из правил… она может фактически ничего не возвращать! Это сделано намеренно, поскольку help является командой для ЧЕЛОВЕКА, а не для ПРИЛОЖЕНИЯ.

Соединение и версия

Весь вывод статуса BOB осуществляется построчно. Строки могут завершаться \n или \r\n в зависимости от системы. При подключении BOB выводит две строки:

BOB version
OK

Текущая версия: 00.00.10

Обратите внимание, что предыдущие версии использовали шестнадцатеричные цифры в верхнем регистре и не соответствовали стандартам версионирования I2P. Рекомендуется, чтобы последующие версии использовали только цифры 0-9.

История версий

VersionI2P Router VersionChanges
00.00.100.9.8current version
00.00.00 - 00.00.0F development versions
## Команды

ОБРАТИТЕ ВНИМАНИЕ: Для получения АКТУАЛЬНОЙ информации о командах ИСПОЛЬЗУЙТЕ встроенную команду помощи. Просто подключитесь через telnet к localhost 2827 и введите help, чтобы получить полную документацию по каждой команде.

Команды никогда не устаревают и не изменяются, однако время от времени добавляются новые команды.

COMMAND     OPERAND                             RETURNS
help        (optional command to get help on)   NOTHING or OK and description of the command
clear                                           ERROR or OK
getdest                                         ERROR or OK and KEY
getkeys                                         ERROR or OK and KEYS
getnick     tunnelname                          ERROR or OK
inhost      hostname or IP address              ERROR or OK
inport      port number                         ERROR or OK
list                                            ERROR or DATA lines and final OK
lookup      hostname                            ERROR or OK and KEY
newkeys                                         ERROR or OK and KEY
option      key1=value1 key2=value2...          ERROR or OK
outhost     hostname or IP address              ERROR or OK
outport     port number                         ERROR or OK
quiet                                           ERROR or OK
quit                                            OK and terminates the command connection
setkeys     KEYS                                ERROR or OK and KEY
setnick     tunnel nickname                     ERROR or OK
show                                            ERROR or OK and information
showprops                                       ERROR or OK and information
start                                           ERROR or OK
status      tunnel nickname                     ERROR or OK and information
stop                                            ERROR or OK
verify      KEY                                 ERROR or OK
visit                                           OK, and dumps BOB's threads to the wrapper.log
zap                                             nothing, quits BOB

После настройки все TCP сокеты могут и будут блокироваться по мере необходимости, и не потребуется никаких дополнительных сообщений в/из командного канала. Это позволяет router контролировать поток без переполнения памяти (OOM), как это происходит с SAM, когда он задыхается, пытаясь протолкнуть множество потоков через один сокет - это не масштабируется при большом количестве соединений!

Что также приятно в этом конкретном интерфейсе, так это то, что написать что-либо для взаимодействия с ним намного проще, чем с SAM. После настройки не требуется никакой дополнительной обработки. Его конфигурация настолько проста, что для указания на какое-либо приложение можно использовать очень простые инструменты, такие как nc (netcat). Ценность заключается в том, что можно планировать время включения и выключения приложения, не изменяя само приложение и даже не останавливая его. Вместо этого вы буквально можете “отключить” destination и “подключить” его снова. Пока при запуске моста используются те же IP/порт адреса и ключи destination, обычное TCP-приложение не будет возражать и не заметит этого. Оно просто будет обмануто — destinations недоступны, и ничего не поступает.

Примеры

В следующем примере мы настроим очень простое локальное loopback-соединение с двумя destination. Destination “mouth” будет службой CHARGEN из демона INET superserver. Destination “ear” будет локальным портом, к которому вы можете подключиться через telnet и наблюдать за красивым потоком ASCII-символов.

Пример диалога сессии

Простой telnet 127.0.0.1 2827 работает.

  • A = Приложение
  • C = Ответ команды BOB.
FROM    TO      DIALOGUE
C       A       BOB 00.00.10
C       A       OK
A       C       setnick mouth
C       A       OK Nickname set to mouth
A       C       newkeys
C       A       OK ZMPz1zinTdy3~zGD~f3g9aikZTipujEvvXOEyYfq4Su-mNKerqG710hFbkR6P-xkouVyNQsqWLI8c6ngnkSwGdUfM7hGccqBYDjIubTrlr~0g2-l0vM7Y8nSqtFrSdMw~pyufXZ0Ys3NqUSb8NuZXpiH2lCCkFG21QPRVfKBGwvvyDVU~hPVfBHuR8vkd5x0teMXGGmiTzdB96DuNRWayM0y8vkP-1KJiPFxKjOXULjuXhLmINIOYn39bQprq~dAtNALoBgd-waZedYgFLvwHDCc9Gui8Cpp41EihlYGNW0cu0vhNFUN79N4DEpO7AtJyrSu5ZjFTAGjLw~lOvhyO2NwQ4RiC4UCKSuM70Fz0BFKTJquIjUNkQ8pBPBYvJRRlRG9HjAcSqAMckC3pvKKlcTJJBAE8GqexV7rdCCIsnasJXle-6DoWrDkY1s1KNbEVH6i1iUEtmFr2IHTpPeFCyWfZ581CAFNRbbUs-MmnZu1tXAYF7I2-oXTH2hXoxCGAAAA

ЗАПОМНИТЕ ВЫШЕУКАЗАННЫЙ КЛЮЧ НАЗНАЧЕНИЯ, У ВАС ОН БУДЕТ ДРУГОЙ!

FROM    TO      DIALOGUE
A       C       outhost 127.0.0.1
C       A       OK outhost set
A       C       outport 19
C       A       OK outbound port set
A       C       start
C       A       OK tunnel starting

На данном этапе ошибки не было, destination с псевдонимом “mouth” настроен. Когда вы соединяетесь с предоставленным destination, вы фактически подключаетесь к службе CHARGEN на 19/TCP.

Теперь перейдем ко второй половине, чтобы мы могли фактически связаться с этим назначением.

FROM    TO      DIALOGUE
C       A       BOB 00.00.10
C       A       OK
A       C       setnick ear
C       A       OK Nickname set to ear
A       C       newkeys
C       A       OK 8SlWuZ6QNKHPZ8KLUlExLwtglhizZ7TG19T7VwN25AbLPsoxW0fgLY8drcH0r8Klg~3eXtL-7S-qU-wdP-6VF~ulWCWtDMn5UaPDCZytdGPni9pK9l1Oudqd2lGhLA4DeQ0QRKU9Z1ESqejAIFZ9rjKdij8UQ4amuLEyoI0GYs2J~flAvF4wrbF-LfVpMdg~tjtns6fA~EAAM1C4AFGId9RTGot6wwmbVmKKFUbbSmqdHgE6x8-xtqjeU80osyzeN7Jr7S7XO1bivxEDnhIjvMvR9sVNC81f1CsVGzW8AVNX5msEudLEggpbcjynoi-968tDLdvb-CtablzwkWBOhSwhHIXbbDEm0Zlw17qKZw4rzpsJzQg5zbGmGoPgrSD80FyMdTCG0-f~dzoRCapAGDDTTnvjXuLrZ-vN-orT~HIVYoHV7An6t6whgiSXNqeEFq9j52G95MhYIfXQ79pO9mcJtV3sfea6aGkMzqmCP3aikwf4G3y0RVbcPcNMQetDAAAA
A       C       inhost 127.0.0.1
C       A       OK inhost set
A       C       inport 37337
C       A       OK inbound port set
A       C       start
C       A       OK tunnel starting
A       C       quit
C       A       OK Bye!

Теперь все, что нам нужно сделать, это подключиться по telnet к 127.0.0.1, порт 37337, отправить ключ назначения или адрес хоста из адресной книги, с которым мы хотим связаться. В данном случае мы хотим связаться с “mouth”, все что нам нужно - это вставить ключ и все заработает.

ПРИМЕЧАНИЕ: Команда “quit” в командном канале НЕ отключает туннели, как в SAM.

$ telnet 127.0.0.1 37337
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ZMPz1zinTdy3~zGD~f3g9aikZTipujEvvXOEyYfq4Su-mNKerqG710hFbkR6P-xkouVyNQsqWLI8c6ngnkSwGdUfM7hGccqBYDjIubTrlr~0g2-l0vM7Y8nSqtFrSdMw~pyufXZ0Ys3NqUSb8NuZXpiH2lCCkFG21QPRVfKBGwvvyDVU~hPVfBHuR8vkd5x0teMXGGmiTzdB96DuNRWayM0y8vkP-1KJiPFxKjOXULjuXhLmINIOYn39bQprq~dAtNALoBgd-waZedYgFLvwHDCc9Gui8Cpp41EihlYGNW0cu0vhNFUN79N4DEpO7AtJyrSu5ZjFTAGjLw~lOvhyO2NwQ4RiC4UCKSuM70Fz0BFKTJquIjUNkQ8pBPBYvJRRlRG9HjAcSqAMckC3pvKKlcTJJBAE8GqexV7rdCCIsnasJXle-6DoWrDkY1s1KNbEVH6i1iUEtmFr2IHTpPeFCyWfZ581CAFNRbbUs-MmnZu1tXAYF7I2-oXTH2hXoxCGAAAA
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
...

После нескольких виртуальных миль этого потока данных нажмите Control-]

...
cdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK
defghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL
efghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./0123456789:;<=
telnet> c
Connection closed.

Вот что произошло…

telnet -> ear -> i2p -> mouth -> chargen -.
telnet <- ear <- i2p <- mouth <-----------'

Вы также можете подключаться к I2P-сайтам!

$ telnet 127.0.0.1 37337
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
i2host.i2p
GET / HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 05 Dec 2008 14:20:28 GMT
Connection: close
Content-Type: text/html
Content-Length: 3946
Last-Modified: Fri, 05 Dec 2008 10:33:36 GMT
Accept-Ranges: bytes

<html>
<head>
  <title>I2HOST</title>
  <link rel="shortcut icon" href="favicon.ico">
</head>
...
<a href="http://sponge.i2p/">--Sponge.</a></pre>
<img src="/counter.gif" alt="!@^7A76Z!#(*&%"> visitors. </body>
</html>
Connection closed by foreign host.
$

Довольно круто, не так ли? Попробуйте другие известные I2P SITES, если хотите, несуществующие и т.д., чтобы понять, какой вывод ожидать в различных ситуациях. В основном рекомендуется игнорировать любые сообщения об ошибках. Они будут бессмысленны для приложения и представлены только для отладки человеком.

Очистка

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

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

FROM    TO      DIALOGUE
A       C       list
C       A       DATA NICKNAME: mouth STARTING: false RUNNING: true STOPPING: false KEYS: true QUIET: false INPORT: not_set INHOST: localhost OUTPORT: 19 OUTHOST: 127.0.0.1
C       A       DATA NICKNAME: ear STARTING: false RUNNING: true STOPPING: false KEYS: true QUIET: false INPORT: 37337 INHOST: 127.0.0.1 OUTPORT: not_set OUTHOST: localhost
C       A       OK Listing done

Хорошо, вот они. Сначала давайте удалим “mouth”.

FROM    TO      DIALOGUE
A       C       getnick mouth
C       A       OK Nickname set to mouth
A       C       stop
C       A       OK tunnel stopping
A       C       clear
C       A       OK cleared

Теперь удалим “ear”, обратите внимание, что это происходит, когда вы набираете слишком быстро, и показывает, как выглядят типичные сообщения об ОШИБКАХ.

FROM    TO      DIALOGUE
A       C       getnick ear
C       A       OK Nickname set to ear
A       C       stop
C       A       OK tunnel stopping
A       C       clear
C       A       ERROR tunnel is active
A       C       clear
C       A       OK cleared
A       C       quit
C       A       OK Bye!

Тихий режим

Я не буду показывать пример принимающей стороны моста, поскольку это очень просто. Для неё есть две возможные настройки, которые переключаются командой “quiet”.

По умолчанию режим НЕ тихий, и первые данные, поступающие в ваш слушающий сокет, — это destination, который устанавливает соединение. Это одна строка, состоящая из BASE64 адреса, за которым следует символ новой строки. Всё, что идёт после этого, предназначено для фактического использования приложением.

В тихом режиме представьте это как обычное интернет-соединение. Никаких дополнительных данных вообще не поступает. Это точно так же, как если бы вы были подключены к обычному интернету напрямую. Этот режим обеспечивает форму прозрачности, очень похожую на ту, что доступна на страницах настроек tunnel в консоли router, так что вы можете использовать BOB для направления destination на веб-сервер, например, и вам не придется вообще модифицировать веб-сервер.

Преимущества BOB

Преимущество использования BOB для этого заключается в том, что обсуждалось ранее. Вы можете планировать случайное время работы приложения, перенаправлять на другую машину и т.д. Одним из применений может быть попытка запутать угадывание доступности router-to-destination. Вы можете останавливать и запускать destination с помощью совершенно другого процесса, создавая случайные периоды включения и выключения сервисов. Таким образом, вы будете только останавливать возможность связаться с таким сервисом, не беспокоясь о его завершении работы и перезапуске. Вы можете перенаправлять и указывать на другую машину в вашей локальной сети во время обновлений, или указывать на набор резервных машин в зависимости от того, что работает, и так далее. Только ваше воображение ограничивает то, что вы можете делать с BOB.

Was this page helpful?