Esta página fue actualizada por última vez el 2020-08.

Warning - Deprecated

Not for use by new applications. BOB supports the DSA-SHA1 signature type only. BOB will not be extended to support new signature types or other advanced features. New applications should use SAM V3.

At this point, most of the good ideas from BOB have been incorporated into SAMv3, which has more features and more real-world use. BOB still works, but it is not gaining the advanced features available to SAMv3 and is essentially unsupported at this time.

Language libraries for the BOB API

Vista general

CLAVES = par de claves pública+privada, estas son BASE64

CLAVE = clave pública, también BASE64

ERROR como está implícito, devuelve el mensaje "ERROR "+DESCRIPCIÓN+"\n", donde la DESCRIPCIÓN es lo que fue mal.

OK devuelve "OK", y si se van a devolver datos, se hará en la misma línea. OK significa que el comando ha finalizado.

DATOS líneas conteniendo la información que usted solicitó. Puede haber múltiples líneas de DATOS por solicitud.

NOTA: El comando `help` es el ÚNICO comando que tiene una excepción a las reglas... actualmente puede devolver ¡nada! Es intencionado, dado que `help` es un HUMANO y no un comando de APLICACIÓN.

Conexión y versión

Toda la salida de estado de BOB es por líneas. Las líneas pueden terminar en \n o \r\n, dependiendo del sistema. En conexión, BOB produce una salida en dos líneas:

BOB version

La versión actual es: 00.00.10

Observe que las versiones anteriores usaban dígitos hexadecimales con letras mayúsculas y no cumplían los estándares de versionado de I2P. Se recomienda que las versiones subsiguientes sólo usen dígitos decimales 0-9. 00.00.10

Historial de la versión

Versión Versión del router I2P Cambios
00.00.10 0.9.8 versión actual
00.00.00 - 00.00.0F   versiones de desarrollo


PLEASE NOTE: For CURRENT details on the commands PLEASE use the built-in help command. Just telnet to localhost 2827 and type help and you can get full documentation on each command.

Los comandos nunca cambian o se vuelven obsoletos, sin embargo nuevos comandos son añadidos de cuando en cuando.

COMANDO     OPERANDO                             DEVUELVE
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

Once set up, all TCP sockets can and will block as needed, and there is no need for any additional messages to/from the command channel. This allows the router to pace the stream without exploding with OOM like SAM does as it chokes on attempting to shove many streams in or out one socket -- that can't scale when you have alot of connections!

What is also nice about this particular interface is that writing anything to interface to it, is much much easier than SAM. There is no other processing to do after the set up. It's configuration is so simple, that very simple tools, such as nc (netcat) can be used to point to some application. The value there is that one could schedule up and down times for an application, and not have to change the application to do that, or to even have to stop that application. Instead, you can literally "unplug" the destination, and "plug it in" again. As long as the same IP/port addresses and destination keys are used when bringing the bridge up, the normal TCP application won't care, and won't notice. It will simply be fooled -- the destinations are not reachable, and that nothing is coming in.


For the following example, we'll setup a very simple local loopback connection, with two destinations. Destination "mouth" will be the CHARGEN service from the INET superserver daemon. Destination "ear" will be a local port that you can telnet into, and watch the pretty ASCII test puke forth.

DIÁLOGO DE SESIÓN DE EJEMPLO -- un simple `telnet 2827` funciona
A = Aplicación
C = Respuesta al comando de BOB.

C	A	BOB 00.00.10
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


A       C     outhost
C       A     OK outhost set
A       C     outport 19
C       A     OK outbound port set
A       C     start
C       A     OK tunnel starting

At this point, there was no error, a destination with a nickname of "mouth" is set up. When you contact the destination provided, you actually connect to the CHARGEN service on 19/TCP.

Ahora para la otra mitad, para que realmente podamos contactar con este destino.

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
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!

Now all we need to do is telnet into, port 37337, send the destination key or host address from address book we want to contact. In this case, we want to contact "mouth", all we do is paste in the key and it goes.

NOTA: El comando "quit" en el canal de comandos NO desconecta los túneles como SAM.

$ telnet 37337
Connected to
Escape character is '^]'.

Después de unas pocas millas virtuales de esta eyección, presione Control-]

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

Aquí está lo que sucedió...

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

You can connect to I2P SITES too!

$ telnet 37337
Connected to
Escape character is '^]'.
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

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

Pretty cool isn't it? Try some other well known I2P SITES if you like, nonexistent ones, etc, to get a feel for what kind of output to expect in different situations. For the most part, it is suggested that you ignore any of the error messages. They would be meaningless to the application, and are only presented for human debugging.

Desactivemos nuestros destinos ahora que hemos terminado del todo con ellos.

Primero, veamos que apodos de destino tenemos.

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:
C	A	DATA NICKNAME: ear STARTING: false RUNNING: true STOPPING: false KEYS: true QUIET: false INPORT: 37337 INHOST: OUTPORT: not_set OUTHOST: localhost
C	A	OK Listing done

De acuerdo, ahí las tiene. Primero, eliminemos "boca" (`mouth`).

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

Ahora para eliminar "oido" (`ear`), note que esto es lo que ocurre cuando teclea demasiado rápido, y le muestra el aspecto de los típicos mensajes de ERROR.

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!

No le molestaré mostrando un ejemplo de un receptor final de una pasarela (`bridge`) porque es muy simple. Hay dos posibles configuraciones para ello, y se accionan con el comando "quiet" (silenciar).

La configuración por defecto es NO silenciado, a y los primeros datos en llegar a su socket de escucha es el destiono que está estableciendo el contacto. Es una sola línea consistente en una dirección BASE64 seguida de una nueva línea. Todo lo que viene después de aquello es en realidad para consumo de la aplicación.

En modo silencioso, piense en él como en una conexión regular a Internet. No hay dato extra entrante alguno. Es tan solo como si estuviera conectado normalmente al Internet regular. Este modo permite una forma de transparencia muy parecida a la que está disponible en las páginas de configuración del túnel de la consola del router, así que usted puede, por ejemplo, usar BOB para apuntar hacia un destino en un servidor web, y no tendría que modificar para nada el servidor web.

La ventaja de usar BOB para esto es la que fue discutida previamente. Puede programar periodos de actividad aleatorios para la aplicación, redirigirla a una máquina diferente, etc. Un uso de esto puede ser algo parecido a tratar de confundir acciones de estimación de la conectividad router-destino. Puede detener e iniciar el destino con un proceso totalmente diferente para establecer periodos aleatorios de actividad e inactividad para los servicios. De ese modo sólo se estaría deteniendo la capacidad de contactar con tal servicio, sin tener que preocuparse cerrándolo y reiniciándolo. Podría redirigir y apuntar a una máquina diferente de su LAN, mientras hace actualizaciones, o apuntar a un conjunto de máquinas de respaldo dependiendo de lo que se esté ejecuntando, etc, etc. Sólo su imaginación limita lo que podría hacer con BOB.