Halaman ini terakhir diperbarui pada sMei 2013 dan akurat untuk router versi 0.9.6.

Mengapa menulis kode khusus I2P?

Ada beberapa cara untuk menggunakan aplikasi di dalam I2P. Menggunakan I2PTunnel, anda dapat menggunakan aplikasi biasa tanpa perlu untuk program dukungan eksplisit I2P. Hal ini sangat efektif untuk skenario client-server, di mana anda perlu untuk menghubungkan ke satu situs web. Anda hanya perlu membuat sebuah tunnel dengan menggunakan I2PTunnel untuk menyambung ke situs web, seperti yang ditunjukkan di dalam gambar 1.

Jika aplikasi anda terdistribusikan, itu akan memerlukan koneksi ke sejumlah besar peer. Dengan menggunakan I2PTunnel, anda akan perlu untuk menciptakan sebuah terowongan baru untuk setiap peer yang anda ingin hubungi, seperti ditunjukkan pada gambar 2. Proses ini tentu akan otomatis, tetapi menjalankan banyak sesi I2PTunnel menciptakan sejumlah besar overhead. Selain itu, dengan banyak protokol, anda akan perlu untuk memaksa semua orang untuk menggunakan port yang sama untuk semua rekan - misalnya jika anda ingin untuk dapat menjalankan DCC chat dengan reliabel, setiap orang harus setuju bahwa port 10001 adalah Alice, port 10002 adalah Bob, port 10003 adalah Charlie, dan seterusnya, karena setiap protokol mencakup informasi spesifik TCP/IP (host dan port).

Aplikasi jaringan umum sering mengirim banyak data tambahan yang dapat digunakan untuk mengidentifikasi pengguna. Nama host, nomor port, zona waktu, rangkaian karakter, dll sering dikirim tanpa memberitahu pengguna. Dengan demikian, merancang protokol jaringan khusus dengan anonimitas dalam dapat menghindari mengorbankan identitas pengguna.

Ada juga pertimbangan efisiensi untuk meninjau saat menentukan bagaimana berinteraksi di atas I2P. Streaming library dan hal-hal yang dibangun di atasnya beroperasi dengan hanshake yang mirip dengan TCP, sedangkan protokol inti I2P (I2NP dan I2CP) secara ketat berbasis pesan (seperti UDP atau dalam beberapa hal adalah raw IP). Perbedaan penting adalah bahwa dengan I2P, komunikasi beroperasi melalui jaringan tebal yang panjang - setiap ujung ke ujung pesan akan memiliki latency yang trivial, namun mungkin berisi muatan sampai beberapa KB. Aplikasi yang membutuhkan permintaan dan respons sederhana dapat menyingkirkan keadaan apa pun dan menghentikan latensi yang terjadi oleh hanshake oleh startup dan teardown dengan menggunakan datagrams (upaya terbaik) tanpa harus khawatir dengan deteksi MTU atau fragmentasi pesan.

Membuat koneksi server-client menggunakan I2PTunnel hanya membutuhkan pembuatan tunnel tunggal.

Gambar 1: Membuat koneksi server-client menggunakan I2PTunnel hanya membutuhkan pembuatan tunnel tunggal.

Setting koneksi untuk aplikasi peer-to-peer memerlukan sejumlah tunnel yang sangat besar.

Gambar 2: Setting koneksi untuk aplikasi peer-to-peer memerlukan sejumlah tunnel yang sangat besar.

Singkatnya, sejumlah alasan untuk menulis kode khusus I2P adalah:
  • Membuat sejumlah besar instance dari I2PTunnel mengkonsumsi sejumlah sumber daya non-trivial, yang bermasalah untuk aplikasi terdistribusi (tunnel baru diperlukan untuk setiap peer).
  • Protokol jaringan umum sering mengirimkan banyak data tambahan yang bisa digunakan untuk mengidentifikasi pengguna. Pemrograman khusus untuk I2P memungkinkan pembuatan protokol jaringan yang tidak membocorkan informasi tersebut, sehingga pengguna tetap anonim dan aman.
  • Protokol jaringan yang dirancang untuk digunakan di internet biasa dapat menjadi tidak efisien pada I2P, yang merupakan jaringan dengan latency yang jauh lebih tinggi.

I2P mendukung interface plugin standar untuk pengembang sehingga aplikasi dapat dengan mudah diintegrasikan dan didistribusikan.

Aplikasi yang ditulis di Java dan dapat diakses / dijalankan dengan menggunakan interface HTML melalui webapps / app.war standar dapat dipertimbangkan untuk dimasukkan ke dalam distribusi i2p.

Konsep-konsep penting

Ada beberapa perubahan yang perlu disesuaikan saat menggunakan I2P:

Destinasi ~= host+port

Aplikasi yang berjalan pada I2P mengirim pesan dari dan menerima pesan ke titik akhir kriptografi aman yang unik - sebuah "destinasi". Dalam istilah TCP atau UDP, destinasi dapat (sebagian besar) dianggap setara dengan nama host plus pasangan nomor port, meskipun ada beberapa perbedaan.

  • Destinasi I2P adalah konstruksi kriptografi - semua data yang dikirim ke satu satu destinasi dienkripsi seolah-olah ada penyebaran IPsec universal dengan lokasi titik akhir (anonim) yang ditandatangani seolah-olah ada penyebaran DNSSEC secara universal.
  • Destinasi i2p pengidentifikasi mobile - mereka dapat dipindahkan dari satu I2P router lain (atau bahkan dapat "multihome" - beroperasi pada router beberapa sekaligus). Hal ini sangat berbeda dari TCP atau UDP yang di mana satu titik akhir (port) harus tetap pada host satu.
  • Destinasi I2P itu jelek dan besar - di belakang layar, mereka berisi kunci publik ElGamal 2048 bit untuk enkripsi, kunci publik DSA 1024 bit untuk signing, dan sertifikat variable size, yang mungkin berisi proof of owrk atau blinded data.

    Ada cara untuk merujuk kepada destinasi yang besar dan jelek ini dengan nama pendek dan cantik (misalnya "irc.duck.i2p"), tetapi teknik tersebut tidak menjamin keunikan global (karena mereka yang tersimpan secara lokal dalam database pada mesin setiap orang) dan mekanisme yang saat ini tidak scalable ataupun tidak aman (update ke daftar host dikelola menggunakan "langganan" naming service). Mungkin suatu hari ada beberapa penamaan sistem yang aman, mudah dibaca manusia, terukur, dan secara global unik,, tapi aplikasi seharusnya tidak bergantung, namun ada orang-orang yang berpikir seperti tidak mungkin terwujud. Informasi lebih lanjut pada sistem penamaan juga tersedia.

Sementara kebanyakan aplikasi tidak perlu membedakan protokol dan port, I2P tidak mendukungnya. Aplikasi yang kompleks dapat menetapkan sebuah protokol, dari port, dan kepada port, untuk setiap pesan, untuk lalu lintas multipleks di satu tujuan. Lihat Halaman datagram untuk rincian. Aplikasi sederhana beroperasi dengan mendengarkan "Semua protokol" pada "semua Port" di suatu destinasi.

Anonimitas dan kerahasiaan

I2p memiliki enkripsi yang transparan dan end to end, dan otentikasi untuk semua data yang disahkan melalui jaringan - jika Bob mengirim ke tujuan Alice, hanya Alice yang dapat menerimanya, dan jika Bob menggunakan datagram atau streaming library, Alice tahu dengan pasti tahu untuk bahwa Bob adalah salah yang mengirim data.

Tentu saja, I2P secara transparan meng-anonimkan data yang dikirim antara Alice dan Bob, tapi itu tidak melakukan apa-apa untuk menganonimkan isi dari pesan yang mereka kirim. Misalnya, jika Alice mengirim kepada Bob, sebuah formulir berisi nama lengkap, no KTP, dan nomor kartu kredit, tidak ada yang I2P dapat lakukan. Dengan demikian, protokol dan aplikasi harus mengingat informasi apa yang mereka coba untuk lindungi dan informasi apa yang mereka bersedia untuk mengekspos.

Datagram i2p dapat mencapai beberapa KB

Aplikasi yang menggunakan I2P datagram (yang mentah atau repliable) dapat pada dasarnya dianggap dalam istilah UDP - datagram adalah unordered, usaha terbaik, dan connectionless - tetapi tidak seperti UDP, aplikasi tidak perlu khawatir tentang Deteksi MTU dan bisa begitu saja mengirimkan datagram yang besar. Sementara batas atas nominal adalah 32 KB, pesan dipecah untuk transportasi, dengan demikian menjatuhkan keandalan dari seluruh datagram. Datagram di atas 10 KB tidak dianjurkan saat ini. Lihat Halaman datagram untuk rincian. Untuk banyak aplikasi, 10 KB data ini cukup untuk seluruh permintaan atau tanggapan, memungkinkan mereka untuk secara transparan beroperasi di I2P sebagai UDP-seperti aplikasi tanpa harus menulis fragmentasi, mengirim ulang, dll.

Opsi pengembangan

Ada beberapa cara pengiriman data dengan I2P, masing-masing dengan kelebihan dan kekurangan. Streaming lib adalah interface yang direkomendasikan, yang digunakan oleh sebagian besar aplikasi I2P.

Streaming Lib

full streaming library sekarang adalah interface yang standar. Hal ini memungkinkan pemrograman menggunakan soket yang menyerupai TCP, seperti yang dijelaskan dalam panduan pengembangan streaming.

BOB

BOB is the Basic Open Bridge, allowing an application in any language to make streaming connections to and from I2P. At this point in time it lacks UDP support, but UDP support is planned in the near future. BOB also contains several tools, such as destination key generation, and verification that an address conforms to I2P specifications. Up to date info and applications that use BOB can be found at this I2P Site.

SAM, SAM V2, SAM V3

SAM tidak dianjurkan. SAM V2 tidak apa-apa, SAM V3 dianjurkan.

SAM adalah protokol Simple Anonymous Messaging , yang memungkinkan aplikasi yang ditulis dalam bahasa pemograman apapun untuk berbicara dengan SAM bridge melalui soket TCP plain dan memiliki bridge multipleks itu di semua lalu lintas I2P, mengkoordinasikan transparan enkripsi/dekripsi dan event based handling. SAM mendukung tiga gaya operasi:

  • stream, ketika Alice dan Bob ingin mengirimkan data ke satu sama lain dengan handal dan dalam urutan
  • repliable datagram, ketika Alice ingin mengirim pesan yang Bob dapat membalas
  • Datagram mentah, ketika Alice ingin memeras sebanyak mungkin bandwidth dan kinerja, dan Bob tidak peduli apakah pengirim data diotentikasi atau tidak (misalnya data yang ditransfer adalah diotentikasi dirinya sendiri)

SAM V3 bertujuan untuk tujuan yang sama dengan SAM dan SAM V2, tetapi tidak memerlukan multiplexing/demultiplexing. Setiap stream I2P ditangani sendiri oleh soket antara aplikasi dan SAM bridge. Selain itu, datagram dapat dikirim dan diterima oleh aplikasi melalui komunikasi datagram dengan SAM bridge.

SAM V2 adalah versi baru yang digunakan oleh imule yang memperbaiki beberapa masalah di SAM.
SAM V3 digunakan oleh imule sejak versi 1.4.0.

I2PTunnel

Aplikasi I2PTunnel memungkinkan aplikasi untuk membangun tunnel seperti TCP untuk peer dengan menciptakan baik I2PTunnel aplikasi 'klien' (yang mendengarkan pada port tertentu dan terhubung ke destinasi I2P tertentu setiap kali soket ke port dibuka) atau I2PTunnel aplikasi 'server' (yang mendengarkan I2P destinasi tertentu dan setiap kali mendapat sambungan I2P baru, itu membuka outproxies untuk host/port TCP tertentu). Stream ini adalah ini 8-bit bersih, dan dikonfirmasi dan dijamin melalui streaming library yang sama yang digunakan oleh SAM, tetapi ada overhead nontrivial terlibat dengan membuat beberapa instance I2PTunnel unik, karena masing-masing memiliki tujuan I2P unik mereka sendiri dan serangkaian tunnel, kunci, dll.

SOCKS

i2p Mendukung SOCKS V4 dan V5 proxy. Koneksi outbound bekerja dengan baik. Fungsi inbound (server) dan UDP mungkin tidak lengkap dan belum teruji.

Ministreaming

Telah dihapus

Dulu ada sebuah library sederhana bernama "ministreaming", tetapi sekarang ministreaming.jar berisi hanya interface untuk streaming library penuh.

Datagram

Direkomendasikan untuk aplikasi seperti UDP

library datagram memungkinkan pengiriman paket seperti UDP. Hal ini dimungkinkan untuk digunakan:

  • Datagram repliable
  • Datagram mentah

I2CP

Tidak direkomendasikan

I2CP sendiri adalah bahasa protokol independen, tapi mengimplementasikan library I2CP di sesuatu selain Java berarti ada sejumlah besar kode yang akan ditulis (encription routines, object marshalling, asynchronous message handling, dll). Sementara seseorang bisa menulis sebuah library I2CP di bahasa C atau yang lain, kemungkinan akan lebih berguna untuk menggunakan library C SAM sebagai gantinya.

Aplikasi Web

I2p dilengkapi dengan Jetty webserver, dan mengkonfigurasi menggunakan Apache server adalah hal yang 'mudah. Teknologi aplikasi web standar apapun seharusnya berfungsi.

Mulai mengembangkan - panduan sederhana

Mengembangkan penggunaan I2P memerlukan pengembangan instalasi I2P dan lingkungan pengembangan pilihan Anda sendiri. Jika anda menggunakan Java, anda dapat memulai pengembangan dengan streaming library atau datagram library. bahasa pemrograman lain, seperti SAM atau BOB, dapat digunakan.

Mengembangkan dengan streaming library

Contoh berikut menunjukkan cara membuat aplikasi klien dan server seperti TCP yang menggunakan streaming library.

Ini akan membutuhkan library berikut di classpath anda:

  • $I2P/lib/streaming.jar: Streaming library itu sendiri
  • $I2P/lib/mstreaming.jar: Mengembangkan untuk streaming library
  • $I2P/lib/i2p.jar: Standar I2P kelas, struktur data, API, dan utilities

Anda dapat mengambil library tersebut dari sebuah instalasi I2P, atau menambahkan dependency dari Maven Central:

  • net.i2p:i2p:2.4.0
  • net.i2p.client:streaming:2.4.0

Jaringan komunikasi memerlukan penggunaan I2P soket jaringan. Untuk menunjukkan hal ini, kita akan menciptakan sebuah aplikasi di mana klien dapat mengirim pesan teks ke server, yang akan mencetak pesan dan mengirim mereka kembali ke klien. Dengan kata lain, server akan berfungsi sebagai gema.

Kita akan mulai dengan inisialisasi aplikasi server. Hal ini memerlukan I2PSocketManager dan menciptakan I2PServerSocket. Kami tidak akan memberikan I2PSocketManagerFactory dengan key yang disimpan untuk destinasi yang ada, sehingga ini akan menciptakan destinasi baru untuk kita. Jadi kita akan meminta I2PSocketManager untuk sebuah I2PSession, sehingga kita bisa mengetahui destinasi yang telah dibuat, karena kita perlu copy dan paste informasi itu nanti sehingga klien bisa terhubung dengan kita.

package i2p.echoserver;

import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;

public class Main {

    public static void main(String[] args) {
        //Initialize application
        I2PSocketManager manager = I2PSocketManagerFactory.createManager();
        I2PServerSocket serverSocket = manager.getServerSocket();
        I2PSession session = manager.getSession();
        //Print the base64 string, the regular string would look like garbage.
        System.out.println(session.getMyDestination().toBase64());
        //The additional main method code comes here...
    }

}

Contoh kode 1: inisialisasi aplikasi server.

Setelah kita memiliki I2PServerSocket, kita dapat membuat seuah instance I2PSocket untuk menerima koneksi dari klien. Untuk contoh ini, kita akan membuat sebuat I2P socket instance yang hanya mampu menangani satu client dalam satu waktu. Server harus dapat menangani beberapa klien. Untuk melakukan ini, beberapa instance I2PSocket harus dibuat, masing-masing di thread terpisah. Setelah kita telah membuat instance I2PSocket, kita membaca data, mencetaknya dan mengirimkannya kembali kepada klien. Kode yang ditebalkan adalah kode baru yang kami tambah.

package i2p.echoserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.util.I2PThread;

import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;

public class Main {

    public static void main(String[] args) {
        I2PSocketManager manager = I2PSocketManagerFactory.createManager();
        I2PServerSocket serverSocket = manager.getServerSocket();
        I2PSession session = manager.getSession();
        //Print the base64 string, the regular string would look like garbage.
        System.out.println(session.getMyDestination().toBase64());

        //Create socket to handle clients
        I2PThread t = new I2PThread(new ClientHandler(serverSocket));
        t.setName("clienthandler1");
        t.setDaemon(false);
        t.start();
    }

    private static class ClientHandler implements Runnable {

        public ClientHandler(I2PServerSocket socket) {
            this.socket = socket;
        }

        public void run() {
            while(true) {
                try {
                    I2PSocket sock = this.socket.accept();
                    if(sock != null) {
                        //Receive from clients
                        BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                        //Send to clients
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
                        String line = br.readLine();
                        if(line != null) {
                            System.out.println("Received from client: " + line);
                            bw.write(line);
                            bw.flush(); //Flush to make sure everything got sent
                        }
                        sock.close();
                    }
                } catch (I2PException ex) {
                    System.out.println("General I2P exception!");
                } catch (ConnectException ex) {
                    System.out.println("Error connecting!");
                } catch (SocketTimeoutException ex) {
                    System.out.println("Timeout!");
                } catch (IOException ex) {
                    System.out.println("General read/write-exception!");
                }
            }
        }

        private I2PServerSocket socket;

    }

}

Contoh kode 2: menerima koneksi dari klien dan menangani pesan.

Ketika anda menjalankan kode server di atas, itu harus mencetak sesuatu seperti ini (namun tanpa akhiran garis, itu hanya harus satu blok besar karakter):

    y17s~L3H9q5xuIyyynyWahAuj6Jeg5VC~Klu9YPquQvD4vlgzmxn4yy~5Z0zVvKJiS2Lk
    poPIcB3r9EbFYkz1mzzE3RYY~XFyPTaFQY8omDv49nltI2VCQ5cx7gAt~y4LdWqkyk3au
    6HdfYSLr45zxzWRGZnTXQay9HPuYcHysZHJP1lY28QsPz36DHr6IZ0vwMENQsnQ5rhq20
    jkB3iheYJeuO7MpL~1xrjgKzteirkCNHvXN8PjxNmxe-pj3QgOiow-R9rEYKyPAyGd2pe
    qMD-J12CGfB6MlnmH5qPHGdZ13bUuebHiyZ1jqSprWL-SVIPcynAxD2Uu85ynxnx31Fth
    nxFMk07vvggBrLM2Sw82pxNjKDbtO8reawe3cyksIXBBkuobOZdyOxp3NT~x6aLOxwkEq
    BOF6kbxV7NPRPnivbNekd1E1GUq08ltDPVMO1pKJuGMsFyZC4Q~osZ8nI59ryouXgn97Q
    5ZDEO8-Iazx50~yUQTRgLMOTC5hqnAAAA
    
Ini adalah representasi base64 dari destinasi server. Klien akan membutuhkan string ini untuk mencapai server.

Sekarang, kita akan menciptakan aplikasi klien. Sekali lagi, sejumlah langkah-langkah diperlukan untuk inisialisasi. Sekali lagi, kita akan perlu memulai dengan mendapatkan I2PSocketManager. Kita tidak akan menggunakan I2PSession dan I2PServerSocket saat ini. Sebaliknya, kita akan menggunakan server Destination string untuk memulai koneksi. Kami akan meminta pengguna untuk destination string, dan menciptakan I2PSocket menggunakan string ini. Setelah kita memiliki I2PSocket, kita bisa mulai mengirim dan menerima data ke dan dari server.

package i2p.echoclient;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination;

public class Main {

    public static void main(String[] args) {
        I2PSocketManager manager = I2PSocketManagerFactory.createManager();
        System.out.println("Please enter a Destination:");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String destinationString;
        try {
            destinationString = br.readLine();
        } catch (IOException ex) {
            System.out.println("Failed to get a Destination string.");
            return;
        }
        Destination destination;
        try {
            destination = new Destination(destinationString);
        } catch (DataFormatException ex) {
            System.out.println("Destination string incorrectly formatted.");
            return;
        }
        I2PSocket socket;
        try {
            socket = manager.connect(destination);
        } catch (I2PException ex) {
            System.out.println("General I2P exception occurred!");
            return;
        } catch (ConnectException ex) {
            System.out.println("Failed to connect!");
            return;
        } catch (NoRouteToHostException ex) {
            System.out.println("Couldn't find host!");
            return;
        } catch (InterruptedIOException ex) {
            System.out.println("Sending/receiving was interrupted!");
            return;
        }
        try {
            //Write to server
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("Hello I2P!\n");
            //Flush to make sure everything got sent
            bw.flush();
            //Read from server
            BufferedReader br2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String s = null;
            while ((s = br2.readLine()) != null) {
                System.out.println("Received from server: " + s);
            }
            socket.close();
        } catch (IOException ex) {
            System.out.println("Error occurred while sending/receiving!");
        }
    }

}

Kode contoh 3: mulai klien dan menghubungkannya ke aplikasi server.

Akhirnya, anda bisa menjalankan server dan aplikasi klien. Pertama, jalankan aplikasi server. Ini akan mencetak string destination (seperti yang ditunjukkan di atas ). Selanjutnya, mulai aplikasi klien. Ketika itu meminta serangkaian destinsi, anda dapat memasukkan string yang dicetak oleh server. Klien kemudian akan mengirimkan 'Halo I2P!' (bersama dengan sebuah newline) ke server, yang akan mencetak pesan dan mengirimnya kembali ke klien.

Selamat, Anda telah berhasil berkomunikasi melalui I2P!

Aplikasi yang sudah ada

Hubungi kami jika anda ingin berkontribusi

See also all the plugins on plugins.i2p, the applications and source code listed on echelon.i2p, and the application code hosted on git.repo.i2p.

See also the bundled applications in the I2P distribution - SusiMail and I2PSnark.

Ide-ide aplikasi

  • NNTP server - ada beberapa di masa lalu, tidak ada ada saat
  • Jabber server - ada beberapa di masa lalu, dan ada satu saat ini, dengan akses ke internet publik
  • PGP key server dan/atau proxy
  • Distribusi Konten / aplikasi DHT - membangkitkan feedspace, port dijjer, mencari beberapa alternatif
  • Membantu dengan pengembangan Syndie
  • Aplikasi berbasis web - langit adalah batas untuk hosting berbasis aplikasi web-server seperti blog, pastebins, penyimpanan, pelacakan, feed, dll. Setiap web atau teknologi CGI seperti Perl, PHP, Python, atau Ruby akan berfungsi.
  • Membangkitkan beberapa apps lama, sebelumnya beberapa ada di dalam paket sumber i2p - bogobot, Celana, proxyscript, q, stasher, proxy kaus kaki, i2ping, feedspace