From 01b56fb57bea7c4271dbdee1eeb422d06770f1e7 Mon Sep 17 00:00:00 2001 From: mathiasdm Date: Thu, 26 Aug 2010 19:28:33 +0000 Subject: [PATCH] Modified network stack (protocols). --- www.i2p2/image_design/protocol_stack.svg | 190 ++++++++++++++++++++++ www.i2p2/pages/protocols.html | 169 ++++++++++--------- www.i2p2/static/images/protocol_stack.png | Bin 0 -> 21058 bytes 3 files changed, 281 insertions(+), 78 deletions(-) create mode 100644 www.i2p2/image_design/protocol_stack.svg create mode 100644 www.i2p2/static/images/protocol_stack.png diff --git a/www.i2p2/image_design/protocol_stack.svg b/www.i2p2/image_design/protocol_stack.svg new file mode 100644 index 00000000..61a6db2d --- /dev/null +++ b/www.i2p2/image_design/protocol_stack.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www.i2p2/pages/protocols.html b/www.i2p2/pages/protocols.html index 0b5dfa13..921e5d47 100644 --- a/www.i2p2/pages/protocols.html +++ b/www.i2p2/pages/protocols.html @@ -4,91 +4,104 @@

Here is the protocol stack for I2P. -See also theIndex to Technical Documentation. +See also the Index to Technical Documentation. Updated August 2010, current for router version 0.8.

- - - - - - - - - - - - - - - - - -
Standard Apps -Jetty, Apache, Monotone, CVS, browsers -  +

+Each of the layers in the stack provides extra capabilities. +The capabilities are listed below, starting at the bottom of the protocol stack. +

    +
  • + Internet Layer: +
    + IP: Internet Protocol, allow addressing hosts on the regular internet and routing packets across the internet using best-effort delivery. +
  • +
  • + Transport Layer: +
    + TCP: Transmission Control Protocol, allow reliable, in-order delivery of packets across the internet. +
    + UDP: User Datagram Protocol, allow unreliable, out-of-order delivery of packets across the internet. +
  • +
  • + I2P Transport Layer: provide encrypted connections between 2 I2P routers. These are not anonymous yet, this is strictly a hop-to-hop connection. + Two protocols are implemented to provide these capabilities. NTCP builds on top of TCP, while SSU uses UDP. +
    + NTCP: NIO-based TCP +
    + SSU: Secure Semi-reliable UDP +
  • +
  • + I2P Tunnel Layer: provide full encrypted tunnel connections. +
    + Tunnel messages: tunnel messages are large messages containing encrypted I2NP (see below) messages and encrypted instructions for their delivery. + The encryption is layered. The first hop will decrypt the tunnel message and read a part. Another part can still be encrypted (with another key), + so it will be forwarded. +
    + I2NP messages: I2P Network Protocol messages are used to pass messages through multiple routers. These I2NP messages are combined in tunnel messages. +
  • +
  • + I2P Garlic Layer: provide encrypted and anonymous end-to-end I2P message delivery. +
    + I2NP messages: I2P Network Protocol messages are wrapped in each other and used to ensure encryption between two tunnels and are passed along from source to destination, keeping both anonymous. +
  • +
+

-
Other I2P Apps -Syndie, EepGet, plugins -  +

+The following layers are strictly speaking no longer part of the I2P Protocol stack, they are not part of the core 'I2P router' functionality. +However, each of these layers adds additional functionality, to allow applications simple and convenient I2P usage. +

    +
  • + I2P Client Layer: allow any client to use I2P functionality, without requiring the direct use of the router API. +
    + I2CP: I2P Client Protocol, allows secure and asynchronous messaging over I2P by communicating messages over the I2CP TCP socket. +
  • +
  • + I2P End-to-end Transport Layer: allow TCP- or UDP-like functionality on top of I2P. +
    + Streaming Library: an implementation of TCP-like streams over I2P. This allows easier porting of existing applications to I2P. +
    + Datagram Library: an implementation of UDP-like messages over I2P. This allows easier porting of existing applications to I2P. +
  • +
  • + I2P Application Interface Layer: additional (optional) libraries allowing easier implementations on top of I2P. +
    + I2PTunnel +
    + SAM/SAMv2/SAMv3(*), + BOB +
  • +
  • + I2P Application Proxy Layer: proxy systems. +
    + HTTP Client/Server, IRC Client, SOCKS, Streamr +
  • +
+

+

+Finally, what could be considered the 'I2P application layer', is a large number of applications on top of I2P. +We can order this based on the I2P stack layer they use. +

    +
  • Streaming/datagram applications: i2psnark, Syndie, i2phex...
  • +
  • SAM/BOB applications: IMule, i2p-bt, i2prufus, Robert...
  • +
  • Other I2P applications: Syndie, EepGet, plugins...
  • +
  • Regular applications: Jetty, Apache, Monotone, CVS, browsers, e-mail...
  • +
+

-
SAM/BOB Apps - -IMule, i2p-bt, i2prufus, Robert +
+
+ I2P Network stack +

+ Figure 1: The layers in the I2P Network stack. +
+
+
-
Proxy Apps -HTTP Client/Server, IRC Client, SOCKS -Streamr - -
Interface Apps -I2PTunnel -SAM -/ -SAMv2 -/ -SAMv3 -(*), BOB - -
Java Apps -i2psnark, Syndie, i2phex -  - -
End-to-End Transport -Streaming Lib -Datagrams - -
Client Protocol -I2CP - -
Network Protocol -I2NP - -
Garlic Encryption -ElGamal/AES+SessionTag - -
Tunnel Messages -Tunnel Messages - -
Tunnel Message Encryption -AES256/CBC - -
Transports -NTCP -SSU - -
Transport Encryption -AES256/CBC - -
-Java NIO TCP -UDP - -
OS -TCP - -

* Note: SAM/SAMv2 can use both the streaming lib and datagrams. +

{% endblock %} diff --git a/www.i2p2/static/images/protocol_stack.png b/www.i2p2/static/images/protocol_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..147f330c7a21e7f8af45670dad4a384de0db571f GIT binary patch literal 21058 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

FTot)vif+#&b{uy!l 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 literal 0 HcmV?d00001