{% extends "_layout.html" %} {% block title %}I2CP{% endblock %} {% block content %}
The I2P Client Protocol (I2CP) exposes a strong seperation of concerns between the router and any client that wishes to communicate over the network. It enables secure and asynchronous messaging by sending and receiving messages over a single TCP socket, yet never exposing any private keys and authenticating itself to the router only through signatures. With I2CP, a client application tells the router who they are (their "destination"), what anonymity, reliability, and latency tradeoffs to make, and where to send messages. In turn the router uses I2CP to tell the client when any messages have arrived, to request authorization for some tunnels to be used, and, if necessary, to notify the client that the router is under attack and unable to operate safely.
As the I2CP requires all client libraries to provide an implementation of the end to end encryption (including ElGamal/AES+SessionTag), the protocol itself isn't likely to be adopted for normal client applications (except for those implemented in Java that can use the existing I2P SDK). Instead, applications can take advantage of the base I2CP plus the streaming and datagram libraries by using the Simple Anonymous Messaging protocol (which does not require clients to deal with any sort of cryptography).
At the moment, while the I2CP has been quite stable since its inception in August of 2003, there have been minor modifications on occation, and until the network as a whole is thoroughly peer reviewed (including the encryption used), making a hard and fast byte level protocol specification does not seem like a wise use of time.
{% endblock %}