User:Rfc1394/Blame Transfer Protocol

The Blame Transfer Protocol or BTP is a transport layer protocol used to transfer blame. It is similar to TCP in its guarantees of data transmission and packet ordering, but instead of being a connection-oriented stream-based protocol, it employs the connectionless datagram model, such as that employed by UDP.

Specification
The BTP is based upon the following clasical scenario of blame transfer involving Alice and Bob, which serves to exemplify the mechanism:

 Who stole the cookies from the cookie jar?  Bob stole the cookies from the cookie jar!  Who me?  Yes you.  Couldn't be.  Then who?  Y stole the cookies from the cookie jar!

Note that the blame is initially undetermined, and is then laid upon Bob by Alice. Bob denies it and transfers the blame to Y. Bob's role is taken by Y and Bob takes Alice's role. The process then repeats until the accused accepts responsibility. Since this may never occur, often an iteration number is passed along with every packet. Packets with iteration numbers above some arbitrary threshold are simply dropped.

Once the blameholder has been found, the information is relayed back along the chain of peer questions. In this way, the blameholder's ID is received by the initiator of the query.

Message types
There are two types of messages in BTP, questions (WHO, ME) and answers (WAS, YES, NO). In BTP shorthand, the dialogue cited above becomes:

X to A : WHO   ? A to * : WAS(B) ! B to A : ME    ? A to B : YES   ! B to A : NO    ! A to B : WHO   ? B to * : WAS(Y) ! (the asterisk represents a broadcast)

Internally, each peer has a stack of incoming and outgoing questions. When a question has been replied to, the peer pops it from the stack.

WAS message
Implementations of the mechanism for choosing the argument for the construction of a WAS packet vary widely - from random selection to process-of-elimination algorithms involving trust and the propagation of information over a network of peers.

Mistaken identity
Consider the following situation:

A to * : WAS(B) C to A : ME A to C : NO

Here the peer named C believes itself to be the peer B. A determines that C is in fact not B</tt> (through any method, such as checking <tt>C</tt>'s IP or connecting to <tt>C</tt>'s Ident port as IRC does) and responds with a NO packet. At this point, <tt>C</tt> should cease its current communications with <tt>A</tt>. It should respond to any further WAS packets, even if they are from <tt>A</tt>.

Port assignment
The port used is unimportant, because typically when a round of blame is being transferred, nothing else is getting done anyway.