Anonymous network protocol
Lately, after listening to all the news about SOPA, PIPA, and ACTA I've started thinking about a quick and easy way to add additional level of privacy or anonymity to exchanging network packets.

Let's take for instance a typical P2P network - Torrents, every torrent client has the option of looking at who's sending you a particular file, get his IP, client version etc - which could easily identify who's the actual person on the other side of the wire, by tracing his ISP's log and checking who was leasing a particular IP address at a certain time.

![P2P client's IP address available when using torrents.][1]


Now, this cannot be prevented because of the very nature of the IP protocol and that TCP needs the info in the IP (sender's address) so that i knows who to ask to resend data when it detects corrupted, missing or otherwise invalid packets.

If we'd look closely at the data packet's anatomy, we could find that:

![Network protocol layers][2]

The sender's identity is carried only on the second layer - the IP layer. 
The sender's physical address get's replaced after the first hop the packet has to go through on it's way to the destination - the first encountered router.

This means that if we'd stop sending the sender's IP address in the IP layer and instead changed a bit the TCP protocol in a way that it will generate a report after it get's the last packet (or the packet it thinks is last) and that report would be pushed to a centralized public server that would be responsible for publishing kind of a list that will say for instance that:

 - Recipient X has successfully got N packages with valid checksums. Or
 - Recipient X has received N packets. Packet 3, 4 and 8 have invalid checksums - please resend.

And that publicly available server would be queried by the sender after sending a bunch of packets to see if needs to resend anything or poll for a confirmation. In case the sender would find his recipient on that published list - it will resend the attached packets. 

With this method, nobody - even the ISP would know who is the real sender, as the info is not in the data packet, unless the very first router on ISP's side will audit every single packet it routes.

Going further - we could also send an invalid MAC-address in the packet and have this one-way communication between the peers and use regular tcp/ip - maybe simple http, for status reporting and validation. Here, even the ISP won't know for sure who's the sender.

With this method, for sure there are going to be tangible performance and speed losses and the status server would be a single-point of failure. But this method could be improved upon to solve these issues.

![Sample p2p session][3]


Is there any existing protocol/method similar to what I've just described that I'm not aware of? If not - is there any flaw in my reasoning that would fundamentally fail this whole approach? If not - I'm more than happy to start prototyping and even developing this as an open-source project!


  [1]: http://i.stack.imgur.com/BlPTm.png
  [2]: http://i.stack.imgur.com/5oJNp.gif
  [3]: http://i.stack.imgur.com/a5JCX.png
Anonymous network protocol
===

Lately, after listening to all the news about SOPA, PIPA, and ACTA I've started thinking about a quick and easy way to add additional level of privacy or anonymity to exchanging network packets.

Let's take for instance a typical P2P network - Torrents, every torrent client has the option of looking at who's sending you a particular file, get his IP, client version etc - which could easily identify who's the actual person on the other side of the wire, by tracing his ISP's log and checking who was leasing a particular IP address at a certain time.

![P2P client's IP address available when using torrents.][1]


Now, this cannot be prevented because of the very nature of the IP protocol and that TCP needs the info in the IP (sender's address) so that i knows who to ask to resend data when it detects corrupted, missing or otherwise invalid packets.

If we'd look closely at the data packet's anatomy, we could find that:

![Network protocol layers][2]

The sender's identity is carried only on the second layer - the IP layer. 
The sender's physical address get's replaced after the first hop the packet has to go through on it's way to the destination - the first encountered router.

This means that if we'd stop sending the sender's IP address in the IP layer and instead changed a bit the TCP protocol in a way that it will generate a report after it get's the last packet (or the packet it thinks is last) and that report would be pushed to a centralized public server that would be responsible for publishing kind of a list that will say for instance that:

 - Recipient X has successfully got N packages with valid checksums. Or
 - Recipient X has received N packets. Packet 3, 4 and 8 have invalid checksums - please resend.

And that publicly available server would be queried by the sender after sending a bunch of packets to see if needs to resend anything or poll for a confirmation. In case the sender would find his recipient on that published list - it will resend the attached packets. 

With this method, nobody - even the ISP would know who is the real sender, as the info is not in the data packet, unless the very first router on ISP's side will audit every single packet it routes.

Going further - we could also send an invalid MAC-address in the packet and have this one-way communication between the peers and use regular tcp/ip - maybe simple http, for status reporting and validation. Here, even the ISP won't know for sure who's the sender.

With this method, for sure there are going to be tangible performance and speed losses and the status server would be a single-point of failure. But this method could be improved upon to solve these issues.

![Sample p2p session][3]


Is there any existing protocol/method similar to what I've just described that I'm not aware of? If not - is there any flaw in my reasoning that would fundamentally fail this whole approach? If not - I'm more than happy to start prototyping and even developing this as an open-source project!


  [1]: http://i.stack.imgur.com/BlPTm.png
  [2]: http://i.stack.imgur.com/5oJNp.gif
  [3]: http://i.stack.imgur.com/a5JCX.png