I2P üzerinde minimal bir WWW vekil sunucu uygulaması kullanma taslağı ve gerekçesi.

I2PTunnel kullanarak I2P üzerinden HTTP işlemi. Temel SocketLibrary çıktığında, tek önemli fark 'wrapRequest' olacaktır ve 'unwrapRequest' işlevsel olarak yönelticiye değil socketLibrary üzerine yerleştirilecektir (ancak sonraki SocketLibrary sürümleri seçici ACK ve büyük pencere kullanarak, daha fazla ACK atlayabilir)

---BROWSER--->-I2PTUNNEL--->-ROUTERA--->-ROUTERB--->-I2PTUNNEL--->-HTTPD----------
 1: openCon
 2:            requestCon
 3:                         wrapRequest
 4:                                    unwrapRequest
 5:                         receiveACK               receiveCon
 6:            sentSuccess                           sendSYN
 7:                                     wrapRequest
 8:                       unwrapRequest
 9:            receiveSYN               receiveACK
10: "GET /"                                          sentSuccess
11:            sendData
12:                         wrapRequest
13:                                    unwrapRequest
14:                         receiveACK               receiveData
15:            sentSuccess                                        "GET /"
16:                                                               "HTTP 200\n\nHi"
17:                                                  sendData
18:                                     wrapRequest
19:                       unwrapRequest
20:            receiveData              receiveACK
21: "HTTP 200\n\nHi"                                 sentSuccess
22: closeCon
23:            sendClose
24:                         wrapRequest
25:                                    unwrapRequest
26:                         receiveACK               receiveClose
27:            sentSuccess

Yalnızca 128KB [1] dosya ve sayfaları işlemek üzere tasarlanmış ve ayarlanmış bir form, önemli ölçüde daha hızlı çalışabilir:

   BROWSER --> MinWWW   --> ROUTERA --> ROUTERB --> MinWWW    --> HTTPD
 1: openCon
 2:            opened
 3: "GET /"
 4:            sendData
 5:                         forward
 6:                                     receive
 7:                                                 receiveData
 8:                                                               "GET /"
 9:                                                               "HTTP 200\n\nHi"
10:                                                 sendData
11:                                     forward
12:                         receive
13:            receiveData
14: "HTTP 200\n\nHi"
15: closeCon
16:            closed

Ağ yükü ve gecikme süresindeki fark önemlidir. Bu aslında bir HTTP UDP sürümüdür. Normal internet üzerinde bunu gerçekten yapamayız, çünkü çoğu HTTP istek ve yanıtı, UDP paketlerinin işlevsel olarak destekleyebileceğinden daha büyük boyutlarda olduğundan, iletiler büyük olabilir. Ağ yükü için tasarruf, daha önceki sarma/açma isteği (garantili teslimat sağlamak için bir "Veri iletisi" ve "Aktarım durumu iletisi", DataMessage ve DeliveryStatusMessage ikilisi) yerine, herhangi bir ACK iletisi göndermemize gerek olmaması gerçeğinden kaynaklanmaktadır. MinWWW vekil sunucusu yeniden göndermelerle ilgilenir (gerekiyorsa. Bugün I2PTunnel üzerinde yeniden gönderim yapılmaz).

MinWWW vekil sunucusunun ve sunucunun sarmalaması gereken veriler önemsizdir - proxy "GET /" paketi göndermek istediğinde, isteği gönderen I2P hedefi ve ardından 4 baytlık bir istek kimliği ile onu hazırlar. MinWWW vekil sunucusu bu istekleri alır, uygun HTTPD ile bağlantı kurar, isteği gönderir, yanıtı bekler ve özgün istek kimliğinin ön ekiyle birlikte yanıtı içeren MinWWW vekil sunucusuna bir yanıt gönderir. Bu yanıt alınarak tarayıcıya geri gönderilir ve bağlantı kapatılır.

Ek olarak, MinWWW vekil sunucusu, round robin veya başka bir algoritma ile bir listeden kullanacağı MinWWW sunucusunu seçebilir. Böylece şeffaf bir şekilde birleştirilmiş birden fazla çıkış vekil sunucusu kullanılır. Bu çıkış vekil sunucularından birini işletmek için gereken bant genişliği de büyük ölçüde azaltılmış olur, çünkü yalnızca 128KB dosyalar işlerler (yani hiç kimse porno, yasal olmayan yazlım kopyaları, vb. indiremez).

İşlevsellik sınırlıdır, ancak 128 KB veri, tek bir HTTP isteği veya yanıtı için çok fazladır. Yukarıdaki diyagramlar da gerçekçi değildir - YÖNELTİCİ-A gerçekte asla doğrudan YÖNELTİCİ-B ile konuşmaz. YÖNELTİCİ-A, iletilerin her birini iki tane ek çıkış yönelticisi üzerinden gönderir, ardından iki tane ek geliş yönelticisi ile YÖNELTİCİ-B üzerine iletir. Bu nedenle gecikme önemlidir - yukarıdaki yalnızca 11 adım tasarruf eder, bu adımlardan 8 tanesinin tüm tünel yolunu geçmesi gerekir (tüneller her uzanmada 2 uzak durak kullandığında 4+ uzak durak, MinWWW 10 yerine yalnızca iki tam geçişle (biri istek için, biri yanıt için) işlemi tamamlar.

MinWWW vekil sunucusu ve sunucuyu eklemek oldukça kolay olmalıdır - istemciden gelen bir HTTP isteğini tam olarak okunur (belki de yalnızca HTTP GET ile başlanır, HTTP POST sonraya bırakılır), ileti sarılır ve yanıt beklenir. Sunucunun, bir soket veya adres açmak için isteği işlemesi, isteği göndermesi, yanıtı beklemesi ve ağ üzerinden geri göndermesi yeterlidir. Birisi bunu yapacak olsa, iyi olur :)

[1] Neden 128KB boyutunda dosyalar? Şu anda I2CP, işlevsel olarak isteğe bağlı ileti boyutu kullanılamasına izin veriyor. Ancak bu seçenek, ara yönelticilerde aşırı bellek yükü ya da yapılması gereken ek işlemler gerektirdiğinden kaldırılacak. I2PTunnel şu anda 128 KB ile sınırlıdır ve bir yük oluşturmamıştır. Bu nedenle I2CP teknik özellikleri güncellendiğinde belki 256 KB olarak değiştirilebilir)