commit 3a8017c239aba1141f7bfd8e3940577bf34c005d
Author: cvs_import here's some content that might help someone who wants to put together an application developer's guide for I2P - I dont have time to polish this up before I leave, but thought it might be of use to someone. Feel free to tear this up, edit like mad, or just read it :) Using mihi's I2PTunnel application, you can hook up application instances and
+have them talk to each other over standard TCP sockets. In plain client-server
+scenarios, this is an effective technique for many simple protocols, but for
+distributed systems where each peer may contact a number of other peers (instead
+of just a single server), or for systems that expose TCP or IP information within
+the communication protocols themselves, there are problems. With I2PTunnel, you need to explicitly instantiate an I2PTunnel for each peer
+you want to contact - if you are building a distributed instant messenger
+application, that means you need to have each peer create an I2PTunnel 'client'
+pointing at each peer it wants to contact, plus a single I2PTunnel 'server' to
+receive other peer's connections. This process can of course be automated, but
+there are nontrivial overheads involved in running more than just a few I2PTunnel
+instances. In addition, with many protocols you will need to force everyone to
+use the same set of ports for all peers - e.g. if you want to reliably run DCC
+chat, everyone needs to agree that port 10001 is Alice, port 10002 is Bob, port
+10003 is Charlie, and so on, since the protocol includes TCP/IP specific information
+(host and port). Applications that are designed to work with I2P can take advantage of its
+built in data security and optional pseudonymous authentication. All data sent
+over the network is transparently end to end encrypted (not even the router's
+get the cleartext), and any application using the ministreaming or datagram
+functionality has all of that data authenticated by the sending destination's
+public key. As an aside, environments where anonymity instead of pseudonymity
+is required are trivially accomodated by either using the I2CP directly, SAM RAW
+sessions, or by simply creating a new sending destination whenever needed). Another important thing to remember is that I2P is simply a communication
+system - what data is sent and what is done with that data is outside of its scope.
+Applications that are used on top of I2P should be carefully sanitized of any
+insecure or identifying data or protocols (hostnames, port numbers, time zone,
+character set, etc). This in and of itself is often a daunting task, as
+analyzing the safety of a system that has had anonymity and security strapped on to
+it is no small feat, giving significant incentive to learn from the experiences of
+the traditional application base, but design the application and its communication
+protocols with I2P's anonymity and security in mind. There are also efficiency considerations to review when determining how to
+interact on top of I2P. The ministreaming library and things built on top of it
+operate with handshakes similar to TCP, while the core I2P protocols (I2NP and I2CP)
+are strictly message based (like UDP or in some instances raw IP). The important
+distinction is that with I2P, communication is operating over a long fat network -
+each end to end message will have nontrivial latencies, but may contain payloads
+of up to 32KB. An application that needs a simple request and response can get rid
+of any state and drop the latency incurred by the startup and teardown handshakes
+by using (best effort) datagrams without having to worry about MTU detection or
+fragmentation of messages under 32KB. The ministreaming library itself uses a
+functional but inefficient scheme for dealing with reliable and in order delivery
+by requiring the equivilant of an ACK after each message which must traverse the
+network end to end again (though there are plans for improving this with a more
+efficient and robust algorithm). Given that as the current state, an application
+that uses one of the I2P message oriented protocols can in some situations get
+substantially better performance. There are a few changes that require adjusting to when using I2P: An application running on I2P sends messages from and receives messages to a
+unique cryptographically secure end point - a "destination". In TCP or UDP
+terms, a destination could (largely) be considered the equivilant of a hostname
+plus port number pair, though there are a few differences. A useful thing to remember is that I2P has transparent end to end encryption
+and authentication for all data passed over the network - if Bob sends Alice's destination,
+only Alice's destination can receive it, and if Bob is using the datagrams or streaming
+library, Alice knows for certain that Bob's destination is the one who sent the data. Of course, another useful thing to remember is that I2P transparently anonymizes the
+data sent between Alice and Bob, but it does nothing to anonymize the content of what they
+send. For instance, if Alice sends Bob a form with her full name, government IDs, and
+credit card numbers, there is nothing I2P can do. As such, protocols and applications should
+keep in mind what information they are trying to protect and what information they are willing
+to expose. Applications that use I2P datagrams (either raw or repliable ones) can essentially be thought
+of in terms of UDP - the datagrams are unordered, best effort, and connectionless - but unlike
+UDP, applications don't need to worry about MTU detection and can simply fire off 32KB datagrams
+(31KB when using the repliable kind). For many applications, 32KB of data is sufficient for an
+entire request or response, allowing them to transparently operate in I2P as a UDP-like
+application without having to write fragmentation, resends, etc. There are four means of sending data over I2P, each with their own pros and cons. SAM is the Simple Anonymous Messaging protocol, allowing an
+application written in any language to talk to a SAM bridge through a plain TCP socket and have
+that bridge multiplex all of its I2P traffic, transparently coordinating the encryption/decryption
+and event based handling. SAM supports three styles of operation: The I2PTunnel application allows applications to build specific TCP-like tunnels to peers
+by creating either I2PTunnel 'client' applications (which listen on a specific port and connect
+to a specific I2P destination whenever a socket to that port is opened) or I2PTunnel 'server'
+applications (which listen to a specific I2P destination and whenever it gets a new I2P
+connection it outproxies to a specific TCP host/port). These streams are 8bit clean and are
+authenticated and secured through the same streaming library that SAM uses, but there is a
+nontrivial overhead involved with creating multiple unique I2PTunnel instances, since each have
+their own unique I2P destination and their own set of tunnels, keys, etc. For applications written in Java, the simplest way to go is to use the libraries that the SAM
+bridge and I2PTunnel applications use. The streaming functionality is exposed in the 'ministreaming'
+library, which is centered on the
+I2PSocketManager,
+the I2PSocket, and the
+I2PServerSocket. For applications that want to use repliable datagrams, they can be built with the
+I2PDatagramMaker
+and parsed on the receiving side by the
+I2PDatagramDissector.
+In turn, these are sent and received through an
+
+I2PSession. Applications that want to use raw datagrams simply send directly through the I2PSession's
+sendMessage(...)
+method, receiving notification of available messages through the
+I2PSessionListener and
+then fetching those messages by calling
+receiveMessage(...).
+
+ I2CP itself is a language independent protocol, but to implement an I2CP library in something other
+than Java there is a significant amount of code to be written (encryption routines, object marshalling,
+asynchronous message handling, etc). While someone could write an I2CP library in C or something else,
+it would most likely be more useful to write a C SAM library instead. While we always gratefully accept any contributions of code,
+documentation, and the like, there are other ways to help I2P move
+forward. As with any open source project, our goals would be achieved more
+rapidly if we were able to support all of our contributors to work on
+I2P full time. However, as with any open source project, thats not a
+possibility. Instead, we are making use of a bounty system, whereby
+anyone can get support for working on something that people want
+implemented, and people who want to contribute to I2P can be assured that
+their support goes to what they care about. We are also keeping open the ability for people who want to support I2P
+but don't have strong feelings about the bounties available. Those people
+can simply put their trust in the I2P team to do what we feel is best by
+donating to a catch-all general fund that will be used as deemed
+necessary - allocated to various bounties, covering incidentals (hosting,
+etc), and the like.
+ Name Status Judge Dev * Bounty Proposal in development None yet $110 Proposal in development [vacant] None yet $60 Proposal in development [vacant] None yet Proposal in development [vacant] hypercubus Proposal in development None yetApplications
+Application development guide
+
+Why write I2P specific code?
+
+Important ideas
+
+Destination ~= host+port
+
+
+
+
+
There are existing ways to refer to these large and ugly destinations by short
+and pretty names (e.g. "irc.duck.i2p"), but at the moment those techniques do not guarantee
+globally uniqueness (since they're stored locally at each person's machine as "hosts.txt")
+and the current mechanism is neither scalable nor secure (updates to those hosts files are
+manually managed within CVS, and as such, anyone with commit rights on the repository can
+change the destinations). There may be some secure, human readable, scalable, and globally
+unique, naming system some day, but applications shouldn't depend upon it being in place,
+since there are those who don't think such a beast is possible :)Anonymity and confidentiality
+
+I2P datagrams can be up to 32KB
+
+Integration techniques
+
+SAM
+
+
+
+
+I2PTunnel
+ministreaming and datagrams
+I2CP
+
+Bounties
+Current bounties
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CLAIMED for $10 USD
+
+
+
+
+
+
+
+
+
+
+
+
+
* Dev lists anyone who may already be working on the bounty - collaboration is preferred, so if you're interested in working on it, please contact one of the people listed!
+ + + ++
E-gold |
+
+ Paypal |
+
1.979 g (~24.02 USD) |
+ 98.53 USD |
+
Thank you for your interest in contributing to I2P! The details of how you can make your contribution are provided below:
+ + +
+Account name: I2P
+Account number: 1274080
+
+ + - Donate $10/month + diff --git a/pages/faq.html b/pages/faq.html new file mode 100644 index 00000000..31cba4bc --- /dev/null +++ b/pages/faq.html @@ -0,0 +1,83 @@ +I2P is a generic anonymous and secure peer to peer communication layer. It is a network that sits on +top of another network (in this case, it sits on top of the internet). It is responsible for delivering +a message anonymously and securely to another location. More tech details are +available
+ +It means that you can do things anonymously and host services anonymously from your computer. +You will need to use programs that are designed to work with I2P, though in some cases you can use +regular internet programs with I2P by creating something called an +I2PTunnel
+ +Data transferred via I2P is anonymous and encrypted. Regular internet traffic is not +(although it can be encrypted). If you set up a web page using I2P, nobody will know who +you are. If you browse a web page using I2P, nobody will know who you are. If you transfer +files using I2P, nobody will know who you are.
+ +An eepsite is a website that is hosted anonymously - you can access it by setting your web browser's HTTP proxy to use the web proxy (typically it listens on localhost port 4444), +and browsing to the site.
+ +Yes - the I2PTunnel eepproxy includes a hook to use an anonymously hosted outbound proxy +(squid.i2p). If you have your browser set to use the web proxy, if you type +http://google.com/ your request will be routed through I2P to the outbound proxy.
+ +I2P is working to support militant grade anonymity, but we're not there yet. You should not +use I2P if you need your anonymity - there are likely bugs and perhaps other issues, and it +has not gone through sufficient peer review. However, we're confident that we'll get to the point +that we can provide anonymity strong enough even for militantly subversive political action (so it +should be fine for you to chat online with your friends)
+ +An important point to note is that I2P does not provide anonymity or security of content +after it is transferred - you can still download and run a virus, or even submit your full name +and bank account numbers on an eepsite. I2P only tries to provide communication security and anonymity - +what you say or do is up to you.
+ ++ For this too, there are several answers. Short summary is "the best it can". + Briefly, I2P attempts to defend against several forms of denial of service + attack, all without centralized coordination. For applications using I2P, + the computer they are located on is not exposed to the public, so the + standard denial of service attack cannot be directly mounted against them + (ala ping floods, etc). Instead, attackers are forced to go after the + gateways to that application's inbound tunnels - of which there can be many + at any given time. Each gateway also has its own limits for how many messages + and/or bytes it agrees to send down the tunnel. The application itself + periodically tests these tunnels to make sure they're still reachable and + usable, so if one of them is taken out by an IP level attack of any kind, + it will know and rebuild its leases, specifying new gateways. +
+
+ To prevent individual users from consuming excessive resources (registering
+ too many tunnels, sending too many messages, looking up too many entries in
+ the network database, and creating too many router and destination identities),
+ various messages and identities have a certificate attached to them. Currently
+ these certificates are blank, but down the line they will be filled with
+ IIP Wiki: HashCash - a computationally expensive collision based on the contents of the
+ message or identity. They can also be filled with other certificates as deemed
+ necessary (e.g. a blinded certificate from an anonymous certificate authority,
+ a receipt for real currency payments, etc). It is also believed that through this
+ certificate attachment system I2P will be able to overcome the sybil attack.
+
+
+ Other denial of service attacks include creating a few thousand high quality + I2P routers, running them for a week, and then taking them all offline. This + indeed may force the creation of islands within the network, but the underlying + Network Database is built off of a modified Kademlia, + which should allow the network to recover with minimal overhead (though, of course, + if a router has literally no other peers left after the bad ones leave, that router will + need to 'reseed' - fetch a reference to another router through some other mechanism). +
+ +Great! Please leave a comment and we'll include it here (with the answer, hopefully)
diff --git a/pages/footer.html b/pages/footer.html new file mode 100644 index 00000000..aa5a7c3e --- /dev/null +++ b/pages/footer.html @@ -0,0 +1,4 @@ + + +