Esta página fue actualizada por última vez el 2025-04 y es precisa con la versión 0.9.66 del router I2P.

Introducción a los datagramas

Los datagramas se construyen sobre la base de I2CP para proporcionar autentificación y mensajes respondibles en un formato estandar. Esto permite a las aplicaciones leer con fiabilidad la dirección "from" (desde) de los datragramas, y confirmar que la dirección envió efectivamente el mensaje. Esto es necesario para algunas aplicaciones ya que el mensaje base I2P es completamente crudo (`raw`) - no tiene dirección "from" (al contrario que los paquetes IP). Además el mensaje y el emisor son autentificados mediante el firmado de la carga.

Los datagramas, al igual que los paquetes de la librería de streaming, son una construcción al nivel de aplicación. Estos protocolos son diferentes de los transportes de bajo nivel; estos protocolos son convertidos en mensajes I2NP por el ruter, y así cualquier protocolo puede ser llevado por cualquier transporte.

Guía de aplicaciones

Las aplicaciones escritas en Java pueden usar la API datagram, mientras que las aplicaciones en otros idomas pueden usar el soporte datagram de SAM. También hay soporte limitado en i2ptunnel en el proxy SOCKS, los tipos de túnel 'streamr', y las clases udpTunnel.

Longitud del datagrama

The application designer should carefully consider the tradeoff of repliable vs. non-repliable datagrams. Also, the datagram size will affect reliability, due to tunnel fragmentation into 1KB tunnel messages. The more message fragments, the more likely that one of them will be dropped by an intermediate hop. Messages larger than a few KB are not recommended. Over about 10 KB, the delivery probablility drops dramatically.

Vea la página de Especificaciones de Datagramas.

Also note that the various overheads added by lower layers, in particular garlic messages, place a large burden on intermittent messages such as used by a Kademlia-over-UDP application. The implementations are currently tuned for frequent traffic using the streaming library.

Número de protocolo y puertos de I2CP

The standard I2CP protocol number for signed (repliable) datagrams is PROTO_DATAGRAM (17). Applications may or may not choose to set the protocol in the I2CP header. The default is implementation-dependent. It must be set to demultiplex datagram and streaming traffic received on the same Destination.

Como los datagramas no están orientados a la conexión, la aplicación puede requerir números de puerto para correlacionar los datagramas con pares ('peers') concrectos o sesiones de comunicaciones, como es tradicional con UDP sobre IP. Las aplicaciones pueden añadir puertos 'from' (origen) y 'to' (destino) a la cabecera (gzip) I2CP como se describe en la página de I2CP.

There is no method within the datagram API to specify whether it is non-repliable (raw) or repliable. The application should be designed to expect the appropriate type. The I2CP protocol number or port should be used by the application to indicate datagram type. The I2CP protocol numbers PROTO_DATAGRAM (signed, also known as Datagram1), PROTO_DATAGRAM_RAW, PROTO_DATAGRAM2, and PROTO_DATAGRAM3 are defined in the I2PSession API for this purpose. A common design pattern in client/server datagram applications is to use signed datagrams for a request which includes a nonce, and use a raw datagram for the reply, returning the nonce from the request.

Defaults:

  • PROTO_DATAGRAM = 17
  • PROTO_DATAGRAM_RAW = 18
  • PROTO_DATAGRAM2 = 19
  • PROTO_DATAGRAM3 = 20

Los protocolos y puertos pueden ser establecidos en la API I2PSession de I2CP, tal como están implementados en I2PSessionMuxedImpl.

Integridad de los datos

Data integrity is assured by the gzip CRC-32 checksum implemented in the I2CP layer. Authenticated datagrams (Datagram1 and Datagram2) also ensure integrity. There is no checksum field in the datagram protocol.

Encapsulado de paquetes

Cada datagrama se envía a través de I2P como un mensaje único (o como un 'clove' (diente) individual en un `Garlic Message)` (mensaje ajo). La encapsulación del mensaje se implementa en los I2CP, I2NP, y las capas de mensaje de túnel subyacentes. No hay mecanismo delimitador de paquetes o campo de tamaño en el protocolo datagram.

Especificación

Vea la página de Especificaciones de Datagramas.