Peningkatan kinerja yang baik adalah menggunakan teknik yang di bawah ini. Ada lebih banyak hal yang harus dilakukan, lihat halaman kinerja untuk isu-isu dan pemikiran saat ini.

Native math

[diimplementasikan]

Ketika saya terakhir memprofilkan kode I2P, sebagian besar waktu dihabiskan dalam satu fungsi: java.math.BigInteger's modPow. Alih-alih mencoba menyesuaikan metode ini, kita akan memanggil GNU MP - sebuah library matematika yang sangat cepat (dengan assembler yang disetel untuk banyak arsitektur). (Editor: Lihat NativeBigInteger untuk kriptografi public key lebih cepat )

ugha dan duck sedang mengerjakan kode C/JNI glue, dan kode Java yang ada sudah diterapkan dengan hook untuk itu kapanpun itu siap. Hasil awal terlihat fantastis - menjalankan router dengan modPow GMP asli menyediakan lebih dari 800 % speedup dalam kinerja enkripsi, dan beban sudah terpotong setengah. Ini hanya pada komputer yang digunakan oleh satu pengguna, dan semuanya tidak siap untuk dipaket dan dipasang.

Garlic wrapping a "reply" LeaseSet

[Diimplementasi namun memerlukan penyempurnaan]

Tweak algoritma ini hanya akan relevan untuk aplikasi yang ingin peer membalas kepada mereka (meskipun yang meliputi segala sesuatu yang menggunakan I2PTunnel atau mihi's ministreaming lib):

Sebelumnya, ketika Alice mengirim pesan kepada Bob, ketika Bob membalas, Bob harus melakukan lookup dalam database jaringan - mengirimkan beberapa permintaan untuk mendapatkan LeaseSet milik Alice saat ini. Jika Bob sudah memiliki Alice LeaseSet saat ini, ia hanya dapat mengirim balasan nya segera - ini (sebagian) penyebab biasanya dibutuhkan waktu sedikit lebih lama untuk berbicara dengan seseorang saat pertama kalinya nda terhubung, tetapi berikutnya komunikasi dapat lebih cepat. Saat ini - untuk semua klien - kami membungkus pengirim LeaseSet saat ini dalam garlic yang akan dikirim kepada penerima, sehingga ketika mereka memberikan balasan, mereka akan selalu memiliki LeaseSet yang tersimpan secara lokal - yang benar-benar menghilangkan kebutuhan untuk sebuah jaringan database lookup balasan. Ini trade off dari sebagian besar bandwidth pengirim untuk balasan yang lebih cepat. Jika kita tidak melakukan ini cukup sering, penggunaan bandwidth jaringan secara keseluruhan akan menurun karena penerima tidak harus melakukan lookup jaringan database.

Untuk LeaseSets tidak diterbitkan seperti "shared client", ini adalah satu-satunya cara untuk mengirimkan LeaseSet kepada Bob. Sayangnya bundling ini setiap saat menambahkan hampir 100% overhead untuk sambungan bandwidth tinggi, dan lebih untuk sambungan dengan pesan yang lebih kecil.

Perubahan yang dijadwalkan untuk rilis 0.6.2 akan mem-bundel LeaseSet hanya bila diperlukan, pada awal koneksi atau ketika perubahan LeaseSet. Ini secara substansial akan mengurangi overhead total dari pesan di I2P.

Penokalan TCP yang lebih efisien

[diimplementasikan]

Saat ini, semua koneksi TCP melakukan semua validasi peer mereka setelah melalui handshaking Diffie-Hellman (mahal) untuk menegosiasikan sesi private key. Ini berarti bahwa jika clock seseorang benar-benar salah, atau NAT/firewall/etc dikonfigurasi secara tidak benar (atau mereka hanya menjalankan versi yang tidak kompatibel di router), mereka akan secara konsisten (meskipun tidak terus-menerus, karena daftar blokir) menyebabkan operasi kriptografi mahal yang sia-sia pada semua peer yang mereka ketahui. Sementara kita akan ingin menyimpan beberapa verifikasi/validasi dalam batas enkripsi, pertama-tama kita akan ingin memperbarui protokol untuk melakukan beberapa hal, sehingga kita dapat menolak mereka secara bersih tanpa membuang-buang banyak CPU atau sumber daya lainnya.

Adjust the tunnel testing

[diimplementasikan]

Alih-alih menggunakan skema yang cukup acak yang kita miliki sekarang, kita harus menggunakan algoritma yang lebih sadar konteks untuk menguji tunnel. misalnya jika kita sudah tahu data yang lewat yang valid dengan benar, ada tidak perlu untuk menguji, sementara jika kita belum melihat data melalui itu baru-baru ini mungkin akan berguna untuk melemparkan beberapa data sambil jalan. Ini akan mengurangi tunnel contention karena kelebihan pesan, serta meningkatkan kecepatan di mana kita mendeteksi - dan menyelesaikan - tunnel yang gagal.

Persistent Tunnel/Lease Selection

Pemilihan outbound tunnel diterapkan di rilis 0.6.1.30, pemilihan inbound least diterapkan dalam rilis 0.6.2.

Memilih tunnel dan lease secara acak untuk setiap pesan menciptakan insiden out-of-order pengiriman yang besar, yang mencegah streaming lib meningkatkan window size sebanyak mungkin. Dengan bertahan di pilihan sama untuk koneksi tertentu, kecepatan transfer menjadi jauh lebih cepat.

Memampatkan beberapa struktur data

[diimplementasikan]

Pesan I2NP dan data yang mereka kandung sudah didefinisikan dalam struktur cukup padat, meskipun satu atribut RouterInfo struktur tidak padat - "option" adalah nama plain ASCII = value mapping. Sekarang, kami sedang mengisinya dengan statistik tersebut - sekitar 3300 byte per peer. Menerapkan kompresi GZip akan hampir memotong itu untuk 1/3 ukuran, dan jika anda mempertimbangkan seberapa sering RouterInfo struktur lewat di seluruh jaringan, itu penghematan yang signifikan - setiap kali sebuah router meminta router lain sebuah catatan networkDb yang tidak memiliki peer, ia akan mengirimkan kembali 3-10 RouterInfo dari mereka.

Uodate protokol ministreaming

[digantikan oleh protokol streaming penuh]

Saat ini mihi's ministreaming library memiliki protokol negosiasi stream yang cukup sederhana - Alice mengirim Bob sebuah pesan SYN, Bob menjawab dengan pesan ACK, kemudian Alice dan Bob mengirimkan satu sama lain beberapa data, sampai salah satu dari mereka mengirim satu pesan CLOSE. Untuk koneksi yang tahan lama (ke IRC server, misalnya), overhead diabaikan, tetapi untuk satu kali permintaan sederhana/tanggapan situasi (HTTP request/reply, misalnya), itu adalah lebih dari dua kali lebih banyak pesan yang diperlukan. Jika, namun, Alice bernama piggybacked muatan pertamanya dengan pesan SYN, dan Bob piggybacked balasannya dengan ACK - dan mungkin juga termasuk CLOSE tag - sementara transient stream seperti HTTP bisa dikurangi menjadi sepasang pesan, bukan SYN + ACK + request response + CLOSE.

Menerapkan protokol streaming penuh

[diimplementasikan]

Protokol ministreaming mengambil keuntungan dari keputusan desain yang buruk dalam protokol klien I2P (I2CP) - pemaparan "mode=GUARANTEED", yang memungkinkan protokol berbasis pesan yang tidak dapat diandalkan, best-effort, dapat digunakan untuk dapat diandalkan, menghalangi operasi (di bawah cover, masih semua tidak dapat diandalkan dan berbasis pesan, dengan router memberikan jaminan pengiriman pesan "ACK" oleh garlic wrapping dengan muatan, jadi begitu data sampai ke sasaran, pesan ACK diteruskan kembali kepada kami. [Melalui tunnel, tentu saja]).

Seperti yang saya telah katakan, membuat I2PTunnel (dan ministreaming lib) melakukan rute ini adalah hal terbaik yang bisa dilakukan, tapi mekanisme yang lebih efisien telah tersedia. Kapan kita rip out fungsi "mode=GUARANTEED", kita pada dasarnya mendapat I2CP yang terlihat seperti layer IP anonim, dan dengan demikian, kita akan mampu menerapkan streaming library untuk mengambil keuntungan dari pengalaman desain TCP layer - ACKs selektif, deteksi kemacetan, nagle, dll.