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.

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.