Internet draft made
authorVictor Grishchenko (Debian) <victor.grishchenko@gmail.com>
Mon, 12 Apr 2010 16:03:20 +0000 (18:03 +0200)
committerVictor Grishchenko (Debian) <victor.grishchenko@gmail.com>
Mon, 12 Apr 2010 16:03:20 +0000 (18:03 +0200)
doc/draft-ietf-ppsp-grishchenko-swift.nroff [new file with mode: 0644]
doc/draft-ietf-ppsp-grishchenko-swift.txt [moved from doc/swift-protocol.txt with 58% similarity]

diff --git a/doc/draft-ietf-ppsp-grishchenko-swift.nroff b/doc/draft-ietf-ppsp-grishchenko-swift.nroff
new file mode 100644 (file)
index 0000000..ac8908f
--- /dev/null
@@ -0,0 +1,747 @@
+.\" \# TD4  -- Set TOC depth by altering this value (TD5 = depth 5)\r
+.\" \# TOC\r
+.\" Auto generated Nroff by NroffEdit on April 12, 2010\r
+.pl 10.0i\r
+.po 0\r
+.ll 7.2i\r
+.lt 7.2i\r
+.nr LL 7.2i\r
+.nr LT 7.2i\r
+.ds LF Grishchenko\r
+.ds RF FORMFEED[Page %]\r
+.ds LH Internet-Draft\r
+.ds RH April 2010\r
+.ds CH swift\r
+.ds CF Expires October 12, 2010\r
+.hy 0\r
+.nh\r
+.ad l\r
+.in 0\r
+.nf\r
+.tl 'PPSP WG' 'V. Grishchenko'\r
+.tl 'Internet-Draft' 'TU Delft'\r
+.tl 'Intended status: Experimental''April 12, 2010'\r
+.tl 'Expires: October 12, 2010'''\r
+\r
+\r
+.fi\r
+.in 3\r
+.in 12\r
+.ti 8\r
+The Generic Multiparty Transport Protocol (swift) \%<draft-ietf-ppsp-grishchenko-swift-00.txt>\r
+\r
+.ti 0\r
+Abstract\r
+\r
+.ti 3\r
+The swift is a generic multiparty (swarming) transport protocol.\r
+\r
+.nf\r
+.in 3\r
+The TCP, today's dominating transport protocol, is connection/\r
+\%conversation-oriented. But traffic-wise, the currently dominating\r
+usecase is content dissemination. There is a multitude of\r
+incompatible approaches to resolve that discrepancy above/below the\r
+transport layer: peer-to-peer, CDN, caches, mirrors, multicast, etc.\r
+The swift aims at creating a single unified content-centric transport\r
+protocol serving as a lingua-franca of content distribution.\r
+To implement that ultimate data cloud model, the protocol has to\r
+unify use cases of data download, video-on-demand and live streaming.\r
+It must work in the settings of client-server, peer-to-peer, CDN or\r
+\%peer-assisted networks, effectively blending those architectures.\r
+\r
+\r
+.ti 0\r
+Status of this memo\r
+\r
+.fi\r
+This Internet-Draft is submitted to IETF in full conformance with the provisions of BCP 78 and BCP 79.\r
+\r
+Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups.  Note that other groups may also distribute working documents as Internet- Drafts.\r
+\r
+Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time.  It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."\r
+\r
+The list of current Internet-Drafts can be accessed at \%http://www.ietf.org/ietf/1id-abstracts.txt.\r
+\r
+The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html.\r
+\r
+\r
+.nf\r
+Copyright (c) 2010 IETF Trust and the persons identified as the\r
+document authors.  All rights reserved.\r
+This document is subject to BCP 78 and the IETF Trust's Legal\r
+Provisions Relating to IETF Documents\r
+\%(http://trustee.ietf.org/license-info) in effect on the date of\r
+publication of this document.  Please review these documents\r
+carefully, as they describe your rights and restrictions with respect\r
+to this document.  Code Components extracted from this document must\r
+include Simplified BSD License text as described in Section 4.e of\r
+the Trust Legal Provisions and are provided without warranty as\r
+described in the Simplified BSD License.\r
+\r
+\r
+.ti 0\r
+Table of Contents\r
+\r
+1.  Requirements notation\r
+2.  Introduction\r
+3.  Design goals\r
+4.  swift subsystems and design choices\r
+  4.1.  The atomic datagram principle\r
+  4.2.  Handshake and multiplexing\r
+  4.3.  Data integrity and on-demand Merkle hashes\r
+  4.4.  Generic acknowledgments\r
+  4.5.  Peer exchange and NAT hole punching\r
+  4.6.  Congestion control\r
+  4.7.  Hints and piece picking\r
+5. Enveloping\r
+  5.1.  IP\r
+  5.2.  UDP\r
+  5.3.  TCP\r
+6. Security Considerations\r
+7. Pending issues\r
+8. Normative References\r
+Author's address\r
+\r
+\r
+.ti 0\r
+1.  Requirements notation\r
+\r
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",\r
+"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in\r
+this document are to be interpreted as described in [RFC2119].\r
+\r
+\r
+.ti 0\r
+2.  Introduction\r
+\r
+Historically, the Internet was based on end-to-end unicast\r
+and, considering the failure of multicast, was addressed by\r
+different technologies, which ultimately boiled down to maintaining\r
+and coordinating distributed replicas. On one hand, downloading\r
+from a nearby well-provisioned replica is somewhat faster and/or\r
+cheaper; on the other hand, it requires to coordinate multiple\r
+parties (the data source, mirrors/CDN sites/peers, consumers). As\r
+the Internet progresses to richer and richer content, the overhead\r
+of peer/replica coordination becomes dwarfed by the mass of the\r
+download itself. Thus, the niche for multiparty transfers expands.\r
+Still, current, relevant technologies are tightly coupled to a\r
+single usecase or even infrastructure of a particular corporation.\r
+The mission of the project is to create a generic content-centric\r
+multiparty transport protocol to allow seamless, effortless data\r
+dissemination on the Net.\r
+\r
+      | mirror-based   peer-assisted        peer-to-peer\r
+------+----------------------------------------------------\r
+data  | SunSITE        CacheLogic VelociX   BitTorrent\r
+VoD   | YouTube        Azureus(+seedboxes)  SwarmPlayer\r
+live  | Akamai Str.    Octoshape, Joost     PPlive\r
+                 TABLE 1. Usecases.\r
+\r
+.fi\r
+The protocol must be designed for maximum genericity, thus focusing on the very core of the mission, contain no magic constants and no hardwired policies. Effectively, it is a set of messages allowing to securely retrieve data from whatever source available, in parallel. The protocol must be able to run over IP as an independent transport protocol. For compatibility reasons, it must also run over UDP and TCP.\r
+\r
+\r
+.ti 0\r
+3.  Design goals\r
+\r
+.nf\r
+The technical focus of the swift protocol is to find the simplest\r
+solution involving the minimum set of primitives, still being\r
+sufficient to implement all the targeted usecases (see Table 1),\r
+suitable for use in general-purpose software and hardware (i.e. a\r
+web browser or a set-top box).\r
+The five design goals for the protocol are:\r
+\r
+1. Embeddable kernel-ready protocol.\r
+2. Embrace real-time streaming, in- and out-of-order download.\r
+3. Have short warm-up times.\r
+4. Traverse NATs transparently.\r
+5. Pluggability/extensibility.\r
+\r
+Later in the draft, the objectives are referenced as (1)-(5).\r
+\r
+device, a browser or even in the kernel space. Thus, the protocol\r
+must have light footprint, preferably less than TCP, in spite\r
+the necessity to support numerous ongoing connections as well as to\r
+constantly probe the network for new possibilities. The practical\r
+overhead for TCP is estimated at 10KB per connection [HTTP1MLN]. We\r
+aim at <1KB per peer connected. Also, the amount of code necessary\r
+to make a basic implementation must be limited to 10KLoC of C.\r
+Otherwise, besides the resource considerations, maintaining and\r
+auditing the code might become prohibitively expensive.\r
+\r
+The support for all three basic usecases of real-time streaming,\r
+\%in-order download and out-of-order download (2) is necessary for\r
+the manifested goal of THE multiparty transport protocol as no\r
+single usecase dominates over the others.\r
+\r
+The objective of short warm-up times (3) is the matter of end-user\r
+experience; the playback must start as soon as possible. Thus\r
+any unnecessary initialization roundtrips and warm-up cycles must be\r
+eliminated from the transport layer.\r
+\r
+.fi\r
+Transparent NAT traversal (4) is absolutely necessary as at least 60% of today's users are hidden behind NATs. NATs severely affect connection patterns in P2P networks thus impacting performance and fairness [MOLNAT,LUCNAT].\r
+\r
+The protocol must define a common message set (5) to be used by implementations; it must not hardwire any magic constants, algorithms or schemes beyound that. For example, an implementation is free to use its own congestion control, connection rotation or reciprocity algorithms. Still, the protocol must enable such algorithms by supplying sufficient information. For example, trackerless peer discovery needs peer exchange messages, scavenger congestion control may need timestamped acknowledgments, etc.\r
+\r
+\r
+.ti 0\r
+4.  swift subsystems and design choices\r
+\r
+.nf\r
+To large extent, swift design is defined by the cornerstone decision\r
+to get rid of TCP and not to reinvent any TCP-like transports on\r
+top of UDP or otherwise. The requirements (1), (4), (5) make TCP a\r
+bad choice due to its high per-connection footprint, complex and\r
+less reliable NAT traversal and fixed predefined congestion control\r
+algorithms. Besides that, an important consideration is that no\r
+block of TCP functionality turns out to be useful for the general\r
+case of swarming downloads. Namely,\r
+  1. in-order delivery is less useful as peer-to-peer protocols\r
+  often employ out-of-order delivery themselves and in either case\r
+  \%out-of-order data can still be stored;\r
+  in-order delivery is not necessary, packet losses might be\r
+  patched up lazily, without stopping the flow of data;\r
+  3. flow control is not necessary as the receiver is much less\r
+  likely to be saturated with the data and even if so, that\r
+  situation is perfectly detected by the congestion control\r
+  4. TCP congestion control is less useful as custom congestion\r
+  control is often needed.\r
+In general, TCP is built and optimized for a different usecase than\r
+we have with swarmed downloads. The abstraction of a "data pipe"\r
+orderly delivering some stream of bytes from one peer to another\r
+turned out to be irrelevant. In even more general terms, TCP\r
+supports the abstraction of pairwise _conversations_, while we need\r
+a content-centric protocol built around the abstraction of a cloud\r
+of participants disseminating the same _data_ in any way and order\r
+that is convenient to them.\r
+\r
+.fi\r
+Thus, the choice is to design the protocol that runs on top of unreliable datagrams. Instead of reimplementing TCP we create a \%datagram-based protocol, completely dropping the sequential data stream abstraction. Ripping off unnecessary features of TCP makes it easier both to implement the protocol, and to check/verify it; e.g. numerous TCP vulnerabilities were caused by complexity of the protocol's state machine. Still, we reserve the possibility to run swift on top of TCP or HTTP. The draft itself assumes swift-over-UDP implementation; the necessary adjustments to run the protocol over IP or TCP a listed in Sec. 5.\r
+\r
+Pursuing the maxim of making things as simple as possible but not simpler, we fit the protocol into the constraints of the transport layer by dropping all the transmission's technical metadata except for the content's root hash (compare that to metadata files used in BitTorrent). Elimination of technical metadata is achieved through the use of Merkle [MERKLE,ABMRKL] hash trees, exclusively single-file transfers and other techniques. As a result, a transfer is identified and bootstrapped by its root hash only.\r
+\r
+.nf\r
+To avoid the usual layering of positive/negative acknowledgment\r
+mechanisms we introduce a scale-invariant acknowledgment system (see\r
+Sec 4.4). The system allows for aggregation and variable level of\r
+detail in requesting, announcing and acknowledging data, serves\r
+\%in-order and out-of-order retrieval with equal ease.\r
+Besides the protocol's footprint, we also aim at lowering the size of\r
+a minimal useful interaction. Once a single datagram is received,\r
+it must be checked for data integrity, and then either dropped or\r
+accepted, consumed and relayed.\r
+\r
+.ti 0\r
+4.1.  The atomic datagram principle\r
+\r
+.fi\r
+loss of one datagram MUST NOT disrupt the flow. Thus, a datagram carries zero or more messages, and neither messages nor message interdependencies should span over multiple datagrams. In particular, any data piece is verified using uncle hash chains; all hashes necessary for verifying data integrity are put into the same datagram as the data (Sec. 4.3). As a general rule, if some additional data is still missing to process a message within a datagram, the message SHOULD be dropped.\r
+\r
+.nf\r
+Each datagram starts with four bytes corresponding to the receiving\r
+channel number (Sec. 4.2). The rest of a datagram is a\r
+concatenation of messages. Each message within a datagram has fixed\r
+length, depending on the type of the message. The first byte of a\r
+message denotes its type. Integers are serialized in the network\r
+\%(big-endian) byte order. Variable-length messages, free-form text\r
+or JSON/bencoded objects are not allowed.\r
+Consider an example of an acknowledgment message (Sec 4.4). It has\r
+message type of 2 and a payload of a four-byte integer (say, 1); it\r
+might be written in hex as: "02 00000001". Later in the document, a\r
+\%hex-like two char per byte notation is used to represent message\r
+formats.\r
+\r
+In case a datagram has a piece of data, a sender MUST always put\r
+the data message (type id 1) in the tail of a datagram. Such a\r
+message consists of type id, bin number (see Sec. 4.3) and the\r
+actual data. Normally there is 1 kilobyte of data, except the case\r
+when file size is not a multiple of 1024 bytes, so the tail packet\r
+is somewhat shorter. Example:\r
+01 00000000 48656c6c6f20776f726c6421\r
+(This message accommodates an entire file: "Hello world!")\r
+\r
+\r
+.ti 0\r
+4.2.  Handshake and multiplexing\r
+\r
+For the sake of simplicity, one transfer always deals with one file\r
+only. Retrieval of large collections of files is done by retrieving\r
+a directory list file and then recursively retrieving files, which\r
+might also turn to be directory lists (see Sec. 4.9). To distinguish\r
+different transfers between the same pair of peers, the protocol\r
+introduces an additional layer of multiplexing, the channels.\r
+"Channels" loosely correspond to TCP connections; "content" of a\r
+single "channel" is a single file. A channel is established with a\r
+handshake. To start a handshake, the initiating peer needs to know\r
+(1) the IP address of a peer\r
+(2) peer's UDP port and\r
+(3) the root hash of the content (see Sec. 4.5).\r
+The handshake is made by a HANDSHAKE message, whose only payload is\r
+a channel number. HANDSHAKE message type is 0. The initiating\r
+Initiator sends an initiating datagram to a peer:\r
+   00000000  04 7FFFFFFF 1234123412341234123412341234123412341234\r
+   00 00000011\r
+(to unknown channel, handshake from channel 0x11, initiating a\r
+transfer of a file with a root hash 123...1234)\r
+\r
+Peer's response datagram:\r
+   00000011  00 00000022  03 00000003\r
+(peer to the initiator: use channel number 0x22 for this transfer;\r
+I also have first 4 kilobytes of the file, see Sec. 4.3)\r
+\r
+At this point, the initiator knows that the peer really responds;\r
+for that purpose channel ids MUST be random enough to prevent easy\r
+guessing. So, the third datagram of a handshake MAY already contain\r
+some heavy payload. To minimize the number of initialization\r
+roundtrips, the first two datagrams MAY also contain some minor\r
+payload, e.g. a couple of HAVE messages roughly indicating the\r
+current progress of a peer or a HINT (see Sec. 4.7).\r
+   00000022\r
+(this is a simple zero-payload keepalive datagram consisting of\r
+a 4-byte channel id only. At this point both peers have the\r
+proof they really talk to each other; three-way handshake is\r
+complete)\r
+\r
+.fi\r
+In general, no error codes or responses are used in the protocol; absence of any response indicates an error. Invalid messages are discarded. Explicit closing of a channel may be achieved by setting channel number to zero by a handshake message: 00 00000000.\r
+\r
+Simple NAT hole punching [SNP] introduces the scenario when both parties of the handshake are initiators. To avoid creation of two transfers in the case both initiating datagrams get through, both peers must then act as responding peers. Thus, once an initiating datagram is sent and another initiating "counter"-datagram is received, the initiating peer sends a response datagram with the same channel id as in the outstanding initiating datagram.\r
+\r
+\r
+.ti 0\r
+4.3.  Generic acknowledgments\r
+\r
+.nf\r
+Generic acknowledgments came out of the need to simplify the\r
+data addressing/requesting/acknowledging mechanics, which tends\r
+to become overly complex and multilayered with the conventional\r
+approach. Take BitTorrent+TCP tandem for example:\r
+\r
+1. The basic data unit is of course a byte of content in a file.\r
+2. BitTorrent's highest-level unit is a "torrent", physically a\r
+2. A torrent is divided into "pieces", typically about a thousand\r
+of them. Pieces are used to communicate own progress to other\r
+peers. Pieces are also basic data integrity units, as the torrent's\r
+metadata includes SHA1 hash for every piece.\r
+3. The actual data transfers are requested and made in 16KByte\r
+units, named "blocks" or chunks.\r
+5. Still, one layer lower, TCP also operates with bytes and byte\r
+offsets which are totally different from the torrent's bytes and\r
+offsets as TCP considers cumulative byte offsets for all content\r
+sent by a connection, be it data, metadata or commands.\r
+6. Finally, another layer lower, IP transfers independent datagrams\r
+(typically around a kilobyte), which TCP then reassembles into\r
+continuous streams.\r
+\r
+Obviously, such addressing schemes need lots of mappings; from\r
+piece number and block to file(s) and offset(s) to TCP sequence\r
+numbers to the actual packets and the other way around. Lots of\r
+complexity is introduced by mismatch of bounds: packet bounds are\r
+different from file, block or hash/piece bounds. The picture is\r
+typical for a codebase which was historically layered.\r
+\r
+To simplify this aspect, we employ a generic content addressing\r
+scheme based on binary intervals (shortcutted "bins"). The base\r
+interval is 1KB "packet", the top interval is the complete 2**63\r
+range.  Till Sec. 4.4.1 any file is considered to be 2**k bytes long.\r
+The binary tree of intervals is simple, well-understood, correlates\r
+well with machine representation of integers and the structure of\r
+Merkle hashes (Sec. 4.4). A novel addition to the classical scheme\r
+are "bin numbers", a scheme of numbering binary intervals which\r
+lays them out into a vector nicely. Bin numbering is done in the\r
+order of interval's "center", ascending, namely:\r
+\r
+.in 4\r
+           7\r
+     3          11\r
+  1     5     9    13\r
+0  2  4  6   8 10 12 14\r
+\r
+.in 3\r
+The number 0xFFFFFFFF (32-bit) or 0xFFFFFFFFFFFFFFFF (64-bit)\r
+stands for an empty interval; 0x7FFF...FFF stands for "everything".\r
+In general, this numbering system allows to work with\r
+simpler data structures, e.g. to use arrays instead of binary trees\r
+in many cases. As a minor convenience, it also allows to use one\r
+integer instead of two to denote an interval. By requiring every\r
+message to use bin numbers, we enforce genericity.\r
+\r
+Back to the acknowledgment message. A HAVE message (type 3) states\r
+that the sending peer obtained the specified bin and successfully\r
+checked its integrity:\r
+(got/checked first four kilobytes of a file/stream)\r
+\r
+The data is acknowledged in terms of bins; as a result, every\r
+single packet is acknowledged logarithmic number of times. That\r
+provides some necessary redundancy of acknowledgments and\r
+sufficiently compensates unreliability of datagrams. Compare that\r
+e.g. to TCP acknowledgments, which are (linearly) cumulative.\r
+For keeping the state information, an implementation MAY use the\r
+"binmap" data structure, which is a hybrid of a bitmap and a binary\r
+tree, discussed in detail in [BINMAP].\r
+An ACK message (type 2) acknowledges data that was received from\r
+its addressee; to facilitate delay-based congestion control, an\r
+ACK message contains a timestamp:\r
+\r
+02 00000002 12345678\r
+(got the second kilobyte of the file from you; my microsecond\r
+timer was showing 0x12345678 at that moment)\r
+\r
+\r
+.ti 0\r
+4.4.  Data integrity and on-demand Merkle hashes\r
+\r
+The integrity checking scheme is unified for two usecases of\r
+download and streaming. Also, it works down to the level of a\r
+single datagram by employing Merkle hash trees [MERKLE]. Peers\r
+receive chains of uncle hashes just in time to check the incoming\r
+data. As metadata is restricted to just a single root hash,\r
+newcomer peers derive the size of a file from hashes. That\r
+functionalities heavily depend on the concept of peak hashes,\r
+discussed in Sec. 4.4.1. Any specifics related to the cases of file\r
+download and streaming is discussed in Sec. 4.4.2, 4.4.3\r
+respectively.\r
+\r
+Here, we discuss the common part of the workflow. As a general\r
+rule, the sender SHOULD prepend data with hashes which are\r
+necessary for verifying that data, no more, no less. While some\r
+optimistic optimizations are definitely possible, the receiver\r
+SHOULD drop data if it is impossible to verify it. Before sending a\r
+packet of data to the receiver, the sender inspects the receiver's\r
+previous acknowledgments to derive which hashes the receiver\r
+already has for sure.\r
+Suppose, the receiver had acknowledged bin 1 (first two kilobytes\r
+of the file), then it must already have uncle hashes 5, 11 and so\r
+on. That is because those hashes are necessary to check packets of\r
+bin 1 against the root hash. Then, hashes 3, 7 and so on must be\r
+also known as they are calculated in the process of checking the\r
+uncle hash chain. Hence, to send bin 12 (i.e. the 7th kilobyte of\r
+data), the sender needs to prepend hashes for bins 14 and 9, which\r
+let the data be checked against hash 11 which is already known to\r
+message itself, i.e.:\r
+\r
+04 00000009 F01234567890ABCDEF1234567890ABCDEF123456\r
+04 0000000E 01234567890ABCDEF1234567890ABCDEF1234567\r
+(uncle hashes for the packet 12)\r
+01 0000000C DA1ADA1ADA1A...\r
+(packet 12 itself)\r
+\r
+The sender MAY optimistically skip hashes which were sent out in\r
+previous (still unacknowledged) datagrams. It is an optimization\r
+tradeoff between redundant hash transmission and possibility of\r
+collateral data loss in the case some necessary hashes were lost in\r
+the network so some delivered data cannot be verified and thus\r
+has to be dropped.\r
+In either way, the receiver builds the Merkle tree on-demand,\r
+incrementally, starting from the root hash, and uses it for data\r
+validation.\r
+\r
+\r
+.ti 0\r
+4.4.1. Peak hashes\r
+\r
+The concept of peak hashes enables two cornerstone features of swift:\r
+download/streaming unification and file size proving. Formally,\r
+peak hashes are hashes defined over filled bins, whose parent\r
+hashes are defined over incomplete (not filled) bins. Filled bin is\r
+a bin which does not extend past the end of the file, or, more\r
+precisely, contains no empty packets. Practically, we use peak\r
+hashes to cover the data range with logarithmic number of hashes,\r
+so each hash is defined over a "round" aligned 2^k interval.\r
+As an example, suppose a file is 7162 bytes long. That fits into\r
+7 packets, the tail packet being 1018 bytes long. The binary\r
+representation for 7 is 111. Here we might note that in general,\r
+every "1" in binary representation of the file's packet length\r
+corresponds to a peak hash. Namely, for this particular file we'll\r
+have three peaks, bin numbers 3, 9, 12.\r
+Thus, once a newcomer joins a swarm, the first peer sending him\r
+data prepends it with peak hashes; the newcomer checks them against\r
+the root hash (see Sec 4.4.2).\r
+\r
+04 00000003 1234567890ABCDEF1234567890ABCDEF12345678\r
+04 00000009 234567890ABCDEF1234567890ABCDEF123456789\r
+04 0000000C 34567890ABCDEF1234567890ABCDEF1234567890\r
+(this sequence of peak hashes proves that a file is 7KB long)\r
+\r
+\r
+.ti 0\r
+4.4.2. Hash trees for files\r
+\r
+the entire data range (2**63 bytes). Every hash in the tree is\r
+defined in the usual way, as a SHA1 hash of a concatenation of two\r
+\%lower-level SHA1 hashes, corresponding to left and right data\r
+\%half-ranges respectively. For example,\r
+             hash_1 = SHA1 (hash_0+hash_2)\r
+where + stands for concatenation and hash_i stands for Merkle hash\r
+of the bin number i. Obviously, that does not hold for the\r
+\%base-layer hashes, which are normal SHA1 hashes over 1KB data\r
+ranges ("packets"), except probably for the tail packet, which\r
+might have less than 1KB of data. The normal recursive formula does\r
+not apply to empty bins, i.e. bins that have no data absolutely;\r
+their hashes are just zeros.\r
+\r
+Lemma. Peak hashes could be checked against the root hash.\r
+Proof. (a) Any peak hash is always the left sibling. Otherwise, be\r
+it the right sibling, its left neighbor/sibling must also be\r
+defined over a filled bin, so their parent is also defined over a\r
+filled bin, contradiction. (b) For the rightmost peak hash, its\r
+right sibling is zero. (c) For any peak hash, its right sibling\r
+might be calculated using peak hashes to the left and zeros for\r
+empty bins. (d) Once the right sibling of the leftmost peak hash\r
+is calculated, its parent might be calculated. (e) Once that parent\r
+is calculated, we might trivially get to the root hash by\r
+concatenating the hash with zeros and hashing it repeatedly.\r
+\r
+.fi\r
+Informally, the Lemma might be expressed as follows: peak hashes cover all data, so the remaining hashes are either trivial (zeros) or might be calculated from peak hashes and zero hashes.\r
+\r
+.nf\r
+Thus, once a peer gets peak hashes and checks them against the\r
+root hash, it learns the file size and it also gets practical\r
+anchors for building uncle chains during the transmission (as the\r
+root hash is too high in the sky). A newcomer peer MAY signal it\r
+already has peak hashes by acknowledging any bin, even the empty one:\r
+\r
+03 FFFFFFFF\r
+\r
+.fi\r
+Otherwise, the first of the senders SHOULD bootstrap him with all the peak hashes.\r
+\r
+\r
+.ti 0\r
+4.4.3. Hash trees for streams\r
+\r
+.nf\r
+In the case of live streaming a transfer is bootstrapped with a\r
+public key instead of a root hash, as the root hash is undefined\r
+or, more precisely, transient, as long as new data keeps coming.\r
+Stream/download unification is achieved by sending signed peak\r
+hashes on-demand, ahead of the actual data. Similarly to the\r
+hashes with the necessary (signed) peak hashes.\r
+Except for the fact that the set of peak hashes changes with the\r
+time, other parts of the algorithm work as described in 4.4.2 As we\r
+see, in both cases data length is not known on advance, but derived\r
+\%on-the-go from the peak hashes. Suppose, our 7KB stream extended to\r
+another kilobyte. Thus, now hash 7 becomes the only peak hash,\r
+eating hashes 3, 9 and 12, so the source sends out a signed peak hash\r
+message (type 7) to announce the fact:\r
+\r
+07 00000007 1234567890ABCDEF1234567890ABCDEF12345678 SOME-SIGN-HERE\r
+\r
+\r
+.ti 0\r
+4.5.  Peer exchange and NAT hole punching\r
+\r
+Peer exchange messages are common for many peer-to-peer protocols.\r
+By exchanging peer IP addresses in gossip fashion, the central\r
+coordinating entities (trackers) might be relieved of unnecessary\r
+work. Following the example of BitTorrent, swift features two types\r
+of PEX messages: "peer connected" (type 5) and "peer disconnected"\r
+(type 6). Peers are represented as IPv4 address-port pairs:\r
+05 7F000000 1F40\r
+(connected to 127.0.0.1:8000)\r
+\r
+To unify peer exchange and NAT hole punching functionality, the\r
+sending pattern of PEX messages is restricted. As swift handshake\r
+is able to do simple NAT hole punching [SNP] transparently, PEX\r
+messages must be emitted in the way to facilitate that. Namely,\r
+once peer A introduces peer B to peer C by sending a PEX message to\r
+C, it SHOULD also send a message to B introducing C. The messages\r
+SHOULD be within 2 seconds from each other, but MAY and better not be\r
+simultaneous, leaving a gap of twice the "typical" RTT, i.e.\r
+\%300-600ms. The peers are supposed to initiate handshakes to each\r
+other thus forming a simple NAT hole punching pattern where the\r
+introducing peer effectively acts as a STUN server. Still, peers\r
+MAY ignore PEX messages if uninterested in obtaining new peers or\r
+because of security considerations (rate limiting) or any other\r
+reason.\r
+\r
+\r
+.ti 0\r
+4.6.  Congestion control\r
+\r
+.fi\r
+swift employs pluggable congestion control. In general, it is expected that servers would use TCP-like congestion control schemes such as classic AIMD or CUBIC [CUBIC]. End-user peers are expected to use weaker-than-TCP (least than best effort) congestion control, such as [LEDBAT] to minimize seeding counter-incentives.\r
+\r
+\r
+.nf\r
+While bulk download protocols normally do explicit requests for\r
+certain ranges of data (e.g. BitTorrent's REQUEST message), live\r
+streaming protocols quite often do without to save round trips.\r
+Explicit requests are often needed for security purposes; consider\r
+that BitTorrent can only verify hashes of complete pieces that\r
+might consist of multiple blocks requested from many peers.\r
+As swift has no such implications, it is supposed to work both\r
+ways. Namely, a peer SHOULD send out requested pieces, while it\r
+also may send some other data in case it runs out of requests or\r
+on some other reason. To emphasize that, request messages are named\r
+HINTs; their only purpose is to coordinate peers and to avoid\r
+unnecessary data retransmission. A peer is supposed to process\r
+HINTs sequentially. HINT message type is 8.\r
+08 00000009\r
+(a peer requests fifth and sixth packets)\r
+\r
+\r
+.ti 0\r
+4.8.  Subsetting of the protocol\r
+\r
+As the same protocol is supposed to serve diverse usecases,\r
+different peers may support different subsets of messages. The\r
+supported subset SHOULD be signaled in the handshake packets.\r
+The SWIFT_MSGTYPE_RCVD message (type 9) serves exactly this\r
+purpose. It contains a 32-bit big-endian number with bits set\r
+to 1 at offsets corresponding to supported message type ids.\r
+E.g. for a tracker peer which receives only handshakes and\r
+(root) hashes, sends out handshakes and PEX_ADD messages, that\r
+message will look like:\r
+09 00000011\r
+Peers running over TCP may not accept ACK messages, etc etc.\r
+\r
+\r
+.ti 0\r
+4.9.  Directory lists\r
+\r
+.fi\r
+Directory list files MUST start with magic bytes ".\n..\n\n". The rest of the file is a newline-separated list of hashes and file names for the content of the directory. An example:\r
+\r
+.nf\r
+.\r
+..\r
+1234567890ABCDEF1234567890ABCDEF12345678  readme.txt\r
+01234567890ABCDEF1234567890ABCDEF1234567  big_file.dat\r
+\r
+\r
+.ti 0\r
+5. Enveloping\r
+\r
+.ti 0\r
+5.1.  IP\r
+\r
+.fi\r
+albeit it has downsides: first NAT/firewall compatibility problems, and second the necessity of in-kernel implementation on both ends.\r
+\r
+\r
+.ti 0\r
+5.2.  UDP\r
+\r
+.nf\r
+Currently, swift-over-UDP is the default deployment option.\r
+Effectively, UDP allows to use IP with minimal overhead, it also\r
+allows userspace implementations.\r
+Besides the classic 1KB packet scenario, the bin numbering allows\r
+to use swift over Jumbo frames/datagrams. Both data and\r
+acknowledgments may use e.g. 8KB packets instead of "standard"\r
+1KB. Hashing scheme stays the same.\r
+Using swift with 512 or 256-byte packets is theoretically possible\r
+with 64-bit byte-precise bin numbers, but IP fragmentation might be\r
+a better method to achieve the same result.\r
+\r
+\r
+.ti 0\r
+5.3.  TCP\r
+\r
+.fi\r
+If ran over TCP, the swift becomes functionally equivalent to BitTorrent. Namely, most swift messages have corresponding BitTorrent messages and vice versa, except for BitTorrent's explicit interest declarations and choking/unchoking, which serve the classic implementation of the tit-for-tat algorithm [TIT4TAT].\r
+\r
+\r
+.ti 0\r
+6. Security Considerations\r
+\r
+As any other network protocol, the swift faces a common set of security challenges. An implementation must consider the possibility of buffer overruns, DoS attacks and manipulation (i.e. reflection attacks). Any guarantee of privacy seems unlikely, as the user is exposing its IP address to the peers. A probable exception is the case of user being hidden behind a public NAT or proxy.\r
+\r
+\r
+.ti 0\r
+7. Extensibility\r
+\r
+.ti 0\r
+7.1. 32 bit vs 64 bit\r
+\r
+.nf\r
+While in principle the protocol supports bigger (>1TB) files, all\r
+the mentioned counters are 32-bit. It is an optimization, as using\r
+\%64-bit numbers on-wire may cost ~2% practical overhead. 64-bit\r
+version of every message has typeid of 64+t, e.g. typeid 68 for\r
+\%64-bit hash message:\r
+44 000000000000000E 01234567890ABCDEF1234567890ABCDEF1234567\r
+Once 32-bit message is supported, its 64-bit version MUST be\r
+.bp\r
+.ti 0\r
+7.2. IPv6\r
+\r
+IPv6 versions of PEX messages use the same 64+t shift as in 6.1.1.\r
+\r
+\r
+.ti 0\r
+7.3. Congestion control algorithms\r
+\r
+.fi\r
+Congestion control algorithm is left to the implementation and may even vary from peer to peer. Congestion control is entirely implemented by the sending peer, the receiver only provides clues, such as hints, acknowledgments and timestamps.\r
+\r
+\r
+.ti 0\r
+7.4. Piece picking algorithms\r
+\r
+Piece picking entirely depends on the receiving peer. The sender peer is made aware of preferred pieces by the means of HINT messages, but may ignore those hints and send unrequested data.\r
+\r
+\r
+.ti 0\r
+7.5. Reciprocity algorithms\r
+\r
+Reciprocity algorithms is the sole responsibility of the sender peer. Reciprocal intentions of the sender are not manifested by separate messages (as BitTorrent's CHOKE/UNCHOKE), as it does not guarantee anything anyway (the "snubbing" syndrome).\r
+\r
+\r
+.ti 0\r
+7.6. Different crypto/hashing schemes\r
+\r
+.nf\r
+Once a flavour of swift will need to use a different crypto scheme\r
+(e.g. SHA-256), a message should be allocated for that. As the root\r
+hash is supplied in the handshake message, the crypto scheme in use\r
+will be known from the very beginning. As the root hash is the\r
+content's identifier, different schemes of crypto cannot be mixed\r
+in the same swarm; different swarms may distribute the same content\r
+using different crypto.\r
+\r
+\r
+.ti 0\r
+References\r
+\r
+.in 0\r
+[RFC2119] Key words for use in RFCs to Indicate Requirement Levels\r
+[HTTP1MLN] Richard Jones. "A Million-user Comet Application with\r
+    Mochiweb", Part 3. http://www.metabrew.com/article/\r
+    \%a-million-user-comet-application-with-mochiweb-part-3\r
+[MOLNAT] J.J.D. Mol, J.A. Pouwelse, D.H.J. Epema and H.J. Sips:\r
+    \%"Free-riding, Fairness, and Firewalls in P2P File-Sharing"\r
+[LUCNAT] submitted\r
+[BINMAP] V. Grishchenko, J. Pouwelse: "Binmaps: hybridizing bitmaps\r
+    and binary trees" http://bouillon.math.usu.ru/articles/\r
+    \%binmaps-alenex.pdf\r
+[SNP] B. Ford, P. Srisuresh, D. Kegel: "Peer-to-Peer Communication\r
+    Across Network Address Translators",\r
+    http://www.brynosaurus.com/pub/net/p2pnat/\r
+[MERKLE] Merkle, R. A Digital Signature Based on a Conventional\r
+    Encryption Function. Proceedings CRYPTO'87, Santa Barbara, CA,\r
+    USA, Aug 1987. pp 369-378.\r
+[ABMRKL] Arno Bakker: "Merkle hash torrent extension", BEP 30,\r
+    http://bittorrent.org/beps/bep_0030.html\r
+[CUBIC] Injong Rhee, and Lisong Xu: "CUBIC: A New TCP-Friendly\r
+    \%High-Speed TCP Variant",\r
+    \%http://www4.ncsu.edu/~rhee/export/bitcp/cubic-paper.pdf\r
+[LEDBAT] S. Shalunov: "Low Extra Delay Background Transport (LEDBAT)"\r
+    \%http://www.ietf.org/id/draft-ietf-ledbat-congestion-00.txt\r
+[TIT4TAT] Bram Cohen: "Incentives Build Robustness in BitTorrent", 2003,\r
+    http://www.bittorrent.org/bittorrentecon.pdf\r
+\r
+Author's address\r
+\r
+.in 3\r
+Victor Grishchenko\r
+TU Delft\r
+\r
+Email: victor.grishchenko@gmail.com\r
+\r
+.ce 0\r
similarity index 58%
rename from doc/swift-protocol.txt
rename to doc/draft-ietf-ppsp-grishchenko-swift.txt
index 76b617f..889e5a7 100644 (file)
-
-        The Generic Multiparty Transport Protocol (swift)
-
-Status of this Memo
-
-   This is a work-in-progress memo.
-
-Copyright Notice
-
-Abstract
-
-   This text is intended to explain inner workings of the swift
-   (peer-to-peer transport protocol), which is currently work in
-   progress. swift was devised to simplify and unify the peer-to-peer/
-   peer-assisted/ multi-source download domain with the long-term
-   practical goal of embedding it into mass software and hardware.
-
-
-Table of Contents
-
-   1.  Requirements notation
-   2.  Introduction
-   3.  Design goals
-   4.  swift subsystems and design choices
-     4.1.  The atomic datagram principle
-     4.2.  Handshake and multiplexing
-     4.3.  Data integrity and on-demand Merkle hashes
-     4.4.  Generic acknowledgements
-     4.5.  Peer exchange and NAT hole punching
-     4.6.  Congestion control
-     4.7.  Hints and piece picking
-   5. Security Considerations
-   6. Pending issues
-   7. Normative References
-   Author's address
-
-1.  Requirements notation
-
-   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
-   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in
-   this document are to be interpreted as described in [RFC2119].
-   
-
-2.  Introduction
-
-   Historically, the Internet was based on end-to-end unicast
-   communication, mostly carried out using TCP. Still, the need for
-   distribution of heavyweight content to masses of users persisted
-   and, considering the failure of multicast, was addressed by
-   different technologies, which ultimately boiled down to maintaining
-   and coordinating distributed replicas. On one hand, downloading
-   from a nearby well-provisioned replica is somewhat faster and/or
-   cheaper; on the other hand, it requires to coordinate multiple
-   parties (the data source, mirrors/CDN sites/peers, consumers). As
-   the Internet progresses to richer and richer content, the overhead
-   of peer/replica coordination becomes dwarfed by the mass of the
-   download itself. Thus, the niche for multiparty transfers expands.
-   Still, current, relevant technologies are tightly coupled to a
-   single usecase or even infrastructure of a particular corporation.
-   The mission of the project is to create a generic content-centric
-   multiparty transport protocol to allow seamless, effortless data
-   dissemination on the Net. 
-   
-         | mirror-based   peer-assisted        peer-to-peer
-   ------+----------------------------------------------------
-   data  | SunSITE        CacheLogic VelociX   BitTorrent
-   VoD   | YouTube        Azureus(+seedboxes)  SwarmPlayer
-   live  | Akamai Str.    Octoshape, Joost     PPlive
-                   TABLE 1. Usecases.
-
-
-3.  Design goals
-
-   The technical focus of the swift protocol is to find the simplest
-   solution involving the minimum set of primitives, still being
-   sufficient to implement all the targeted usecases (see Table 1),
-   suitable for use in general-purpose software and hardware (i.e. a
-   web browser or a set-top box).
-   The five design goals for the protocol are:
-
-   1. Embeddable kernel-ready protocol.
-   2. Embrace both real-time streaming and download. 
-   3. Short warm-up times.
-   4. Transparent NAT traversal.
-   5. Non-intrusive congestion control.
-
-   Later in the draft, the objectives are referenced as (1)-(5).
-
-   The goal of embedding (1) means that the protocol must be ready to
-   function as a regular transport protocol inside a set-top box,
-   mobile device, a browser or even in the kernel space. Thus, the
-   protocol must have light footprint, even less than TCP due to the
-   necessity to support numerous ongoing connections as well as to
-   constantly probe the network for new possibilities. The practical
-   overhead for TCP is estimated at 10KB per connection [HTTP1MLN]. We
-   aim at 1KB per peer connected. Also, the amount of code necessary
-   to make a basic implementation must be limited to 10KLoC of C.
-   Otherwise, besides the resource considerations, maintaining and
-   auditing the code might become prohibitively expensive.
-
-   The support for all three basic usecases of real-time streaming,
-   in-order download and out-of-order download (2) is necessary for
-   the manifested goal of THE multiparty transport protocol as no
-   single usecase dominates over the others.
-
-   The objective of short warm-up times (3) is the matter of end-user
-   experience; the playback must start as soon as possible. Thus
-   at the transport layer any unnecessary initialization roundtrips
-   and warm-up cycles must be eliminated.
-   
-   Transparent NAT traversal (4) is absolutely necessary as at least
-   60% of today's users are hidden behind NATs. NATs severely affect
-   conection patterns in P2P networks thus impacting performance and
-   fairness [MOLNAT,LUCNAT].
-   
-   Custom non-intrusive congestion control (5) is a must-have as
-   interference of downloads with the regular traffic is the main
-   incentive for the end-user to shut down the program. Advanced
-   bandwidth-scavenging congestion control techniques might
-   potentially lead to incentiveless seeding (see Sec. 4.6). Besides
-   that, behavior patterns of swarming download applications are so
-   special and bandwidth consumption is so high that custom congestion
-   control makes sense in the general case.
-   
-
-4.  swift subsystems and design choices
-
-   To large extent, swift design is defined by the cornerstone decision
-   to get rid of TCP and not to reinvent any TCP-like transports on
-   top of UDP or otherwise. The requirements (1), (4), (5) make TCP a
-   bad choice due to its high per-connection footprint, complex and
-   less reliable NAT traversal and fixed predefined congestion control
-   algorithms. Besides that, an important consideration is that no
-   block of TCP functionality turns out to be useful for the general
-   case of swarming downloads. Namely,
-     1. in-order delivery is less useful as peer-to-peer protocols
-     often employ out-of-order delivery themselves and in either case
-     out-of-order data can still be stored;
-     2. reliable delivery/retransmissions are less useful because
-     the same data might be requested from different sources; as
-     in-order delivery is not necessary, packet losses might be
-     patched up lazily, without stopping the flow of data;
-     3. flow control is not necessary as the receiver is much less
-     likely to be saturated with the data and even if so, that
-     situation is perfectly detected by the congestion control
-     4. TCP congestion control is less useful as custom congestion
-     control is often needed.
-   In general, TCP is built and optimized for a different usecase than
-   we have with swarmed downloads. The abstraction of a "data pipe"
-   orderly delivering some stream of bytes from one peer to another
-   turned out to be irrelevant. In even more general terms, TCP
-   supports the abstraction of pairwise _conversations_, while we need
-   a content-centric protocol built around the abstraction of a cloud
-   of participants disseminating the same _data_ in any way and order
-   that is convenient to them.
-   
-   Thus, the choice is to make a UDP-based transport, possibly
-   reserving HTTP tonneling as an universal fallback. Further, instead
-   of reimplementing TCP we create a datagram-based protocol,
-   completely dropping the sequential data stream abstraction. Ripping
-   off unnecessary features of TCP makes it easier both to implement
-   the protocol and to check it for vulnerabilities; numerous TCP
-   vulnerabilities were caused by complexity of the protocol's state
-   machine.
-   Pursuing the maxim of making  things as simple as possible but not
-   simpler, we fit the protocol into the constraints of the transport
-   layer by dropping all the transmission's technical metadata except
-   for the content's root hash (compare to e.g. .torrent files in
-   BitTorrent). Elimination of technical metadata was achieved through
-   the use of Merkle hash trees, exclusively single-file transfers
-   and other techniques. As a result, a transfer is identified and
-   bootstrapped by its root hash only.
-   To avoid the usual layering of positive/negative acknowledgement
-   mechanisms we design a scale-invariant acknowledgement system (Sec
-   4.4). The system allows for aggregation and variable level of
-   detail in requesting, announcing and acknowledging data, in-order
-   or out-of-order with equal ease.
-   Besides the protocol's footprint, we also target the size of a
-   minimal useful interaction; every single datagram might be checked
-   for data integrity, consumed or relayed immediately once received.
-
-4.1.  The atomic datagram principle
-
-   Ideally, every datagram sent must be independent of other
-   datagrams, so each datagram SHOULD be processed separately and a
-   loss of one datagram MUST NOT disrupt the flow. Thus, a datagram
-   carries zero or more messages, and neither messages nor message
-   interdependencies should span over multiple datagrams. In
-   particular, any data piece is verified using uncle hash chains; all
-   hashes necessary for verifying data integrity are put into the same
-   datagram as the data (Sec. 4.3). As a general rule, if some
-   additional data is still missing to process a message within a
-   datagram, the message SHOULD be dropped.
-
-   Each datagram starts with four bytes corresponding to the receiving
-   channel number (Sec. 4.2). The rest of a datagram is a
-   concatenation of messages. Each message within a datagram has fixed
-   length, depending on the type of the message. The first byte of a
-   message denotes its type. Integers are serialized in the network
-   (big-endian) byte order. Variable-length messages, free-form text
-   or JSON/bencoded objects are not allowed. 
-   Consider an example of an acknowledgement message (Sec 4.4). It has
-   message type of 2 and a payload of a four-byte integer (say, 1); it
-   might be written in hex as: "02 00000001". Later in the document, a
-   hex-like two char per byte notation is used to represent message
-   formats.
-
-   In case a datagram has a piece of data, a sender MUST always put
-   the data message (type id 1) in the tail of a datagram. Such a
-   message consists of type id, bin number (see Sec. 4.3) and the
-   actual data. Normally there is 1 kilobyte of data, except the case
-   when file size is not a multiple of 1024 bytes, so the tail packet
-   is somewhat shorter. Example:
-   01 00000000 48656c6c6f20776f726c6421
-   (This message accommodates an entire file: "Hello world!")
-
-
-4.2.  Handshake and multiplexing
-
-   For the sake of simplicity, one transfer always deals with one file
-   only. Retrieval of large collections of files is done by retrieving
-   a directory list file and then recursively retrieving files, which
-   might also turn to be directory lists. To distinguish different
-   transfers between the same pair of peers, the protocol introduces
-   an additional layer of multiplexing, the channels. "Channels"
-   loosely correspond to TCP connections; "content" of a single
-   "channel" is a single file. A channel is established with a
-   handshake. To start a handshake, the initiating peer needs to know
-   (1) the requested peer's IP address
-   (2) peer's UDP port and
-   (3) root hash of the content (see Sec. 4.5).
-   The handshake is made by a HANDSHAKE message, whose only payload is
-   a channel number. HANDSHAKE message type is 0. The initiating
-   handshake is sent to channel #0. Datagrams to that pseudo-channel
-   MUST start with the root hash of the transfer.
-   
-   Initiator sends an initiating datagram to a peer:
-      00000000  04 7FFFFFFF 1234123412341234123412341234123412341234
-      00 00000011
-   (to unknown channel, handshake from channel 0x11, initiating a
-   transfer of a file with a root hash 123...1234)
-   
-   Peer's response datagram:
-      00000011  00 00000022  03 00000003
-   (peer to the initiator: use channel number 0x22 for this transfer;
-   I also have first 4 kilobytes of the file, see Sec. 4.3)
-   
-   At this point, the initiator knows that the peer really responds;
-   for that purpose channel ids MUST be random enough to prevent easy
-   guessing. So, the third datagram of a handshake MAY already contain
-   some heavy payload. To minimize the number of initialization
-   roundtrips, the first two datagrams MAY also contain some minor
-   payload, e.g. a couple of HAVE messages roughly indicating the
-   current progress of a peer or a HINT (see Sec. 4.7).
-      00000022
-   (this is a simple zero-payload keepalive datagram; consisting of
-   the 4-byte channel id, only. At this point both peers have the
-   proof they really talk to each other; three-way handshake is
-   complete)
-   
-   In general, no error codes or responses are used in the protocol;
-   absence of any response indicates an error. Invalid messages are
-   discarded. Explicit close of a channel is achieved by setting
-   channel number to zero by a handshake message: 00 00000000.
-   
-   Simple NAT hole punching [SNP] introduces the scenario when both
-   parties of the handshake are initiators. To avoid creation of two
-   transfers in the case both initiating datagrams get through, both
-   peers must then act as responding peers. Thus, once an initiating
-   datagram is sent and another initiating "counter"-datagram is
-   received, the initiating peer sends a response datagram with the
-   same channel id as in the outstanding initiating datagram.
-
-
-4.3.  Generic acknowledgements
-
-   Generic acknowledgements came out of the need to simplify the
-   data addressing/requesting/acknowledging mechanics, which tends
-   to become overly complex and multilayered with the conventional
-   approach. Take BitTorrent+TCP tandem for example:
-   
-   1. The basic data unit is of course a byte of content in a file.
-   2. BitTorrent's highest-level unit is a "torrent", physically a
-   byte range resulting from concatenation of one or many content
-   files.
-   2. A torrent is divided into "pieces", typically about a thousand
-   of them. Pieces are used to communicate own progress to other
-   peers. Pieces are also basic data integrity units, as the torrent's
-   metadata includes SHA1 hash for every piece.
-   3. The actual data transfers are requested and made in 16KByte
-   units, named "blocks" or chunks.
-   5. Still, one layer lower, TCP also operates with bytes and byte
-   offsets which are totally different from the torrent's bytes and
-   offsets as TCP considers cumulative byte offsets for all content
-   sent by a connection, be it data, metadata or commands.
-   6. Finally, another layer lower IP transfers independent datagrams
-   (typically around a kilobyte), which TCP then reassembles into
-   continuous streams.
-   
-   Obviously, such addressing schemes need lots of mappings; from
-   piece number and block to file(s) and offset(s) to TCP sequence
-   numbers to the actual packets and the other way around. Lots of
-   complexity is introduced by mismatch of bounds: packet bounds are
-   different from file, block or hash/piece bounds. The picture is
-   typical for a codebase which was historically layered.
-   
-   To simplify this aspect, we employ a generic content addressing
-   scheme based on binary intervals (shortcutted "bins"). The base
-   interval is 1KB "packet", the top interval is the complete file.
-   Till Sec. 4.4.1 any file is considered to be 2**k bytes long.
-   The binary tree of intervals is simple, well-understood, correlates
-   well with machine representation of integers and the structure of
-   Merkle hashes (Sec. 4.4). A novel addition to the classical scheme
-   are "bin numbers", a scheme of numbering binary intervals which
-   lays them out into a vector nicely. Bin numbering is done in the
-   order of interval's "center", ascending, namely:
-
-               7
-         3          11
-      1     5     9    13
-    0  2  4  6   8 10 12 14
-    
-   The number 0xFFFFFFFF (32-bit) or 0xFFFFFFFFFFFFFFFF (64-bit)
-   stands for an empty interval; 0x7FFFFFFF (32-bit) stands for
-   "everything". In general, this numbering system allows to work with
-   simpler data structures, e.g. to use arrays instead of binary trees
-   in many cases. As a minor convenience, it also allows to use one
-   integer instead of two to denote an interval.
-   
-   Back to the acknowledgement message. A HAVE message (type 3) states
-   that the sending peer obtained the specified bin and successfully
-   checked its integrity:
-
-   03 00000003
-   (got/checked first four kilobytes of a file/stream)
-   
-   The data is acknowledged in terms of bins; as a result, every
-   single packet is acknowledged logarithmical number of times. That
-   provides some necessary redundancy of acknowledgements and
-   sufficiently compensates unreliability of datagrams. Compare that
-   e.g. to TCP acknowledgements, which are (linearly) cumulative.
-   For keeping the state information, an implementation MAY use the
-   "binmap" datastructure, which is a hybrid of a bitmap and a binary
-   tree, discussed in detail in [BINMAP].
-   An ACK message (type 2) acknowledges data that was received from
-   its addressee; to facilitate delay-based congestion control, an
-   ACK message contains a timestamp:
-
-   02 00000002 12345678
-   (got the second kilobyte of the file from you; my microsecond
-   timer was showing 0x12345678 at that moment)
-
-
-4.4.  Data integrity and on-demand Merkle hashes
-
-   The integrity checking scheme is unified for two usecases of
-   download and streaming. Also, it works down to the level of a
-   single datagram by employing Merkle hash trees [MERKLE]. Peers
-   receive chains of uncle hashes just in time to check the incoming
-   data. As metadata is restricted to just a single root hash,
-   newcomer peers derive the size of a file from hashes. That
-   functionalities heavily depend on the concept of peak hashes,
-   discussed in Sec. 4.4.1. Any specifics related to the cases of file
-   download and streaming is discussed in Sec. 4.4.2, 4.4.3
-   respectively.
-  
-   Here, we discuss the common part of the workflow. As a general
-   rule, the sender SHOULD prepend data with hashes which are
-   necessary for verifying that data, no more, no less. While some
-   optimistic optimizations are definitely possible, the receiver
-   SHOULD drop data if it is impossible to verify it. Before sending a
-   packet of data to the reciever, the sender inspects the receiver's
-   previous acknowledgements to derive which hashes the receiver
-   already has for sure. 
-   Suppose, the receiver had acknowledged bin 1 (first two kilobytes
-   of the file), then it must already have uncle hashes 5, 11 and so
-   on. That is because those hashes are necessary to check packets of
-   bin 1 against the root hash. Then, hashes 3, 7 and so on must be
-   also known as they are calculated in the process of checking the
-   uncle hash chain. Hence, to send bin 12 (i.e. the 7th kilobyte of
-   data), the sender needs to prepend hashes for bins 14 and 9, which
-   let the data be checked against hash 11 which is already known to
-   the receiver. 
-   The sender MUST put into the datagram the chain of uncle hashes
-   necessary for verification of the packet, always before the data
-   message itself, i.e.:
-
-   04 00000009 F01234567890ABCDEF1234567890ABCDEF123456
-   04 0000000E 01234567890ABCDEF1234567890ABCDEF1234567
-   (uncle hashes for the packet 12)
-   
-   The sender MAY optimistically skip hashes which were sent out in
-   previous (still unacknowledged) datagrams. It is an optimization
-   tradeoff between redundant hash transmission and possibility of
-   collateral data loss in the case some necessary hashes were lost in
-   the network so some delivered data cannot be verified and thus
-   has to be dropped.
-   In either way, the receiver builds the Merkle tree on-demand,
-   incrementally, starting from the root hash, and uses it for data
-   validation.
-   
-   
-4.4.1. Peak hashes
-
-   The concept of peak hashes enables two cornerstone features of
-   download/streaming unification, and file size proving. Formally,
-   peak hashes are hashes defined over filled bins, whose parent
-   hashes are defined over incomplete (not filled) bins. Filled bin is
-   a bin which does not extend past the end of the file, or, more
-   precisely, contains no empty packets. Practically, we use peak
-   hashes to cover the data range with logarithmical number of hashes,
-   so each hash is defined over a "round" aligned 2^k interval.
-   As an example, suppose a file is 7162 bytes long. That fits into
-   7 packets, the tail packet being 1018 bytes long. The binary
-   representation for 7 is 111. Here we might note that in general,
-   every "1" in binary representation of the file's packet length
-   corresponds to a peak hash. Namely, for this particular file we'll
-   have three peaks, bin numbers 3, 9, 12.
-   Thus, once a newcomer joins a swarm, the first peer sending him
-   data prepends it with peak hashes; the newcomer checks them against
-   the root hash (see Sec 4.4.2).
-   
-   04 00000003 1234567890ABCDEF1234567890ABCDEF12345678
-   04 00000009 234567890ABCDEF1234567890ABCDEF123456789
-   04 0000000C 34567890ABCDEF1234567890ABCDEF1234567890
-   (this sequence of peak hashes proves that a file is 7KB long)
-
-
-4.4.2. Hash trees for files 
-
-   In the case of static file download a transfer is bootstrapped with
-   a root hash. The root hash corresponds to the root bin covering
-   the entire 2**63 KB data range. Every hash in the tree is defined
-   in the usual way, as a SHA1 hash of a concatenation of two
-   lower-level SHA1 hashes, corresponding to left and right data
-   half-ranges resp. For example,
-                hash_1 = SHA1 (hash_0+hash_2)
-   where + stands for concatenation and hash_i stands for Merkle hash
-   of the bin number i. Obviously, that does not hold for the
-   base-layer hashes, which are normal SHA1 hashes over 1KB data
-   ranges ("packets"), except probably for the tail packet, which
-   might have less than 1KB of data. The normal recursive formula does
-   not apply to empty bins, i.e. bins that have no data absolutely;
-   their hashes are just zeros.
-   
-   Lemma. Peak hashes could be checked against the root hash.
-   Proof. (a) Any peak hash is always the left sibling. Otherwise, be
-   it the right sibling, its left neighbor/sibling must also be
-   defined over a filled bin, so their parent is also defined over a
-   filled bin, contradiction. (b) For the rightmost peak hash, its
-   right sibling is zero. (c) For any peak hash, its right sibling
-   might be calculated using peak hashes to the left and zeros for
-   empty bins. (d) Once the right sibling of the leftmost peak hash
-   is calculated, its parent might be calculated. (e) Once that parent
-   is calculated, we might trivially get to the root hash by
-   concatenating the hash with zeros and hashing it repeatedly.
-   
-   Informally, the Lemma might be expressed as follows: peak hashes
-   cover all data, so the remaining hashes are either trivial (zeros)
-   or might be calculated from peak hashes and zero hashes.
-   
-   Thus, once a peer gets peak hashes and checks them against the
-   root hash, it learns the file size and it also gets practical
-   anchors for building uncle chains during the transmission (as the
-   root hash is too high in the sky). A newcomer peer MAY signal it
-   already has peak hashes by acknowledging any bin, even empty one:
-
-   03 FFFFFFFF
-
-   Otherwise, the first of the senders SHOULD bootstrap him with all
-   the peak hashes.
-   
-
-4.4.3. Hash trees for streams
-   
-   In the case of live streaming a transfer is bootstrapped with a
-   public key instead of a root hash, as the root hash is undefined
-   or, more precisely, transient, as long as new data keeps coming.
-   Stream/download unification is achieved by sending signed peak
-   hashes on-demand, ahead of the actual data. Similarly to the
-   previous case, the sender mightuse acknowledgements to derive which
-   data range the receiver has peak hashes for and to prepend the data
-   and the uncle hashes with the necessary (signed) peak hashes.
-   Except for the fact that the set of peak hashes changes with the
-   time, other parts of the algorithm work as described in 4.4.2 As we
-   see, in both cases data length is not known on advance, bit derived
-   on-the-go from the peak hashes. Suppose, our 7KB stream extended to
-   another kilobyte. Thus, now hash 7 becomes the only peak hash,
-   eating hashes 3, 9, 12 and the source sends out a signed peak hash
-   message (type 7) to announce the fact:
-   
-   07 00000007 1234567890ABCDEF1234567890ABCDEF12345678 SOME-SIGN-HERE
-
-
-4.5.  Peer exchange and NAT hole punching
-
-   Peer exchange messages are common for many peer-to-peer protocols.
-   By exchanging peer IP addresses in gossip fashion, the central
-   coordinating entities (trackers) might be releived of unnecessary
-   work. Following the example of BitTorrent, swift features two types
-   of PEX messages: "peer connected" (type 5) and "peer disconnected"
-   (type 6). Peers are represented as IPv4 address-port pairs:
-   05 7F000000 1F40
-   (connected to 127.0.0.1:8000)
-   
-   To unify peer exchange and NAT hole punching functionality, the
-   sending pattern of PEX messages is restricted. As swift handshake
-   is able to do simple NAT hole punching [SNP] transparently, PEX
-   messages must be emitted in the way to facilitate that. Namely,
-   once peer A introduces peer B to peer C by sending a PEX message to
-   C, it SHOULD also send a message to B introducing C. The messages
-   MUST be within 2 seconds from each other, but MAY and better not be
-   simultaneous, leaving a gap of twice the "typical" RTT, i.e.
-   300-600ms. The peers are supposed to initiate handshakes to each
-   other thus forming a simple NAT hole punching pattern where the
-   introducing peer effectively acts as a STUN server. Still, peers
-   MAY ignore PEX messages if uninterested in obtaining new peers or
-   because of security considerations (rate limiting) or any other
-   reason.
-
-
-4.6.  Congestion control
-
-   Swift employs pluggable congestion control. In general, it is 
-   expected that servers would use TCP-like congestion control schemes
-   such as classic AIMD or CUBIC [CUBIC]. End-user peers are expected
-   to use weaker-than-TCP (least than best effort) congestion control,
-   such as [LEDBAT] to minimize seeding counter-incentives.
-
-
-4.7.  Data requests (HINTs)
-
-   While bulk download protocols normally do explicit requests for
-   certain ranges of data (e.g. BitTorrent's REQUEST message), live
-   streaming protocols quite often do without to save round trips.
-   Explicit requests are often needed for security purposes; consider
-   that BitTorrent can only verify hashes of complete pieces that 
-   might consist of multiple blocks requested from many peers.
-   As swift has no such implications, it is supposed to work both 
-   ways. Namely, a peer SHOULD send out requested pieces, while it
-   also may send some other data in case it runs out of requests or
-   on some other reason. To emphasize that, request messages are named
-   HINTs; their only purpose is to coordinate peers and to avoid
-   unnecessary data retransmission. A peer is supposed to process
-   HINTs sequentially. HINT message type is 8.
-   08 00000009
-   (a peer requests fifth and sixth packets)
-
-
-4.8.  Subsetting of the protocol
-   
-   As the same protocol is supposed to serve diverse usecases,
-   different peers may support different subsets of messages. The
-   supported subset SHOULD be signalled in the handshake packets.
-   The SWIFT_MSGTYPE_RCVD message (type 9) serves exactly this
-   purpose. It contains a 32-bit big-endian number with bits set
-   to 1 at offsets corresponding to supported message type ids.
-   E.g. for a tracker peer which receives only handshakes and
-   (root) hashes, sends out handshakes and PEX_ADD messages, that
-   message will look like:
-   09 00000011
-
-
-5. Security Considerations
-
-   Simplify as possible (e.g. no buffer overruns). Still, resource,
-   membership subverting [] for DDoS Thus, implementation MUST at
-   least rate-limit activity to untested destinations. E.g. 4 attempts
-   a second: million peers, 1Gb/sec, amplification ratio 4.
-
-
-6.6. Extensibility
-
-6.1.1. 32 bit vs 64 bit
-   While in principle the protocol supports bigger (>1TB) files, all
-   the mentioned counters are 32-bit. It is an optimization, as using
-   64-bit numbers on-wire packet format may cost ~2% overhead. 64-bit
-   version of every message has typeid of 64+t, e.g. typeid 68 for
-   64-bit hash message:
-   44 000000000000000E 01234567890ABCDEF1234567890ABCDEF1234567
-   Once 32-bit message is supported, its 64-bit version MUST be
-   understood as well.
-
-6.1.2. IPv6
-   IPv6 versions of PEX messages use the same 64+t shift as in 6.1.1.
-
-6.1.3. Congestion control algorithms
-6.1.4. Piece picking algorithms
-6.1.5. Reciprocity algorithms
-6.1.6. Different crypto/hashing schemes
-   Once a flavour of swift will need to use a different crypto scheme
-   (e.g. SHA-256), a message should be allocated for that. As the root
-   hash is supplied in the handshake message, the crypto scheme in use
-   will be known from the very beginning. As the root hash is the
-   content's identifier, different schemes of crypto cannot be mixed
-   in the same swarm; different swarms may distribute the same content
-   using different crypto.
-
-
-References
-
-[RFC2119] Key words for use in RFCs to Indicate Requirement Levels
-[HTTP1MLN] Richard Jones. "A Million-user Comet Application with
-    Mochiweb", Part 3. http://www.metabrew.com/article/
-    a-million-user-comet-application-with-mochiweb-part-3
-[MOLNAT] J.J.D. Mol, J.A. Pouwelse, D.H.J. Epema and H.J. Sips:
-    "Free-riding, Fairness, and Firewalls in P2P File-Sharing"
-    8-th IEEE International Conference on Peer-to-Peer Computing
-    2008, pp 301-310
-[LUCNAT] submitted
-[BINMAP] V. Grishchenko, J. Pouwelse: "Binmaps: hybridizing bitmaps
-    and binary trees" http://bouillon.math.usu.ru/articles/
-    binmaps-alenex.pdf
-[SNP] B. Ford, P. Srisuresh, D. Kegel: "Peer-to-Peer Communication
-    Across Network Address Translators", 
-    http://www.brynosaurus.com/pub/net/p2pnat/
-[MERKLE] Merkle, R. A Digital Signature Based on a Conventional
-    Encryption Function. Proceedings CRYPTO'87, Santa Barbara, CA,
-    USA, Aug 1987. pp 369-378.
-[CUBIC] Injong Rhee, and Lisong Xu: "CUBIC: A New TCP-Friendly
-    High-Speed TCP Variant", 
-    http://www4.ncsu.edu/~rhee/export/bitcp/cubic-paper.pdf
-[LEDBAT] S. Shalunov: "Low Extra Delay Background Transport (LEDBAT)"
-    http://www.ietf.org/id/draft-ietf-ledbat-congestion-00.txt
-
-Author's address
\r
+\r
+\r
+\r
+PPSP WG                                                   V. Grishchenko\r
+Internet-Draft                                                  TU Delft\r
+Intended status: Experimental                             April 12, 2010\r
+Expires: October 12, 2010                                               \r
+\r
+\r
+        The Generic Multiparty Transport Protocol (swift)\r
+            <draft-ietf-ppsp-grishchenko-swift-00.txt>\r
+\r
+Abstract\r
+\r
+   The swift is a generic multiparty (swarming) transport protocol.\r
+\r
+   The TCP, today's dominating transport protocol, is connection/\r
+   conversation-oriented. But traffic-wise, the currently dominating\r
+   usecase is content dissemination. There is a multitude of\r
+   incompatible approaches to resolve that discrepancy above/below the\r
+   transport layer: peer-to-peer, CDN, caches, mirrors, multicast, etc.\r
+   The swift aims at creating a single unified content-centric transport\r
+   protocol serving as a lingua-franca of content distribution.\r
+   To implement that ultimate data cloud model, the protocol has to\r
+   unify use cases of data download, video-on-demand and live streaming.\r
+   It must work in the settings of client-server, peer-to-peer, CDN or\r
+   peer-assisted networks, effectively blending those architectures.\r
+\r
+\r
+Status of this memo\r
+\r
+   This Internet-Draft is submitted to IETF in full conformance with the\r
+   provisions of BCP 78 and BCP 79.\r
+\r
+   Internet-Drafts are working documents of the Internet Engineering\r
+   Task Force (IETF), its areas, and its working groups.  Note that\r
+   other groups may also distribute working documents as Internet-\r
+   Drafts.\r
+\r
+   Internet-Drafts are draft documents valid for a maximum of six months\r
+   and may be updated, replaced, or obsoleted by other documents at any\r
+   time.  It is inappropriate to use Internet-Drafts as reference\r
+   material or to cite them other than as "work in progress."\r
+\r
+   The list of current Internet-Drafts can be accessed at\r
+   http://www.ietf.org/ietf/1id-abstracts.txt.\r
+\r
+   The list of Internet-Draft Shadow Directories can be accessed at\r
+   http://www.ietf.org/shadow.html.\r
+\r
+\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 1]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   Copyright (c) 2010 IETF Trust and the persons identified as the\r
+   document authors.  All rights reserved.\r
+   This document is subject to BCP 78 and the IETF Trust's Legal\r
+   Provisions Relating to IETF Documents\r
+   (http://trustee.ietf.org/license-info) in effect on the date of\r
+   publication of this document.  Please review these documents\r
+   carefully, as they describe your rights and restrictions with respect\r
+   to this document.  Code Components extracted from this document must\r
+   include Simplified BSD License text as described in Section 4.e of\r
+   the Trust Legal Provisions and are provided without warranty as\r
+   described in the Simplified BSD License.\r
+\r
+\r
+Table of Contents\r
+\r
+   1.  Requirements notation\r
+   2.  Introduction\r
+   3.  Design goals\r
+   4.  swift subsystems and design choices\r
+     4.1.  The atomic datagram principle\r
+     4.2.  Handshake and multiplexing\r
+     4.3.  Data integrity and on-demand Merkle hashes\r
+     4.4.  Generic acknowledgments\r
+     4.5.  Peer exchange and NAT hole punching\r
+     4.6.  Congestion control\r
+     4.7.  Hints and piece picking\r
+   5. Enveloping\r
+     5.1.  IP\r
+     5.2.  UDP\r
+     5.3.  TCP\r
+   6. Security Considerations\r
+   7. Pending issues\r
+   8. Normative References\r
+   Author's address\r
+\r
+\r
+1.  Requirements notation\r
+\r
+   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",\r
+   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in\r
+   this document are to be interpreted as described in [RFC2119].\r
+\r
+\r
+2.  Introduction\r
+\r
+   Historically, the Internet was based on end-to-end unicast\r
+   and, considering the failure of multicast, was addressed by\r
+   different technologies, which ultimately boiled down to maintaining\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 2]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   and coordinating distributed replicas. On one hand, downloading\r
+   from a nearby well-provisioned replica is somewhat faster and/or\r
+   cheaper; on the other hand, it requires to coordinate multiple\r
+   parties (the data source, mirrors/CDN sites/peers, consumers). As\r
+   the Internet progresses to richer and richer content, the overhead\r
+   of peer/replica coordination becomes dwarfed by the mass of the\r
+   download itself. Thus, the niche for multiparty transfers expands.\r
+   Still, current, relevant technologies are tightly coupled to a\r
+   single usecase or even infrastructure of a particular corporation.\r
+   The mission of the project is to create a generic content-centric\r
+   multiparty transport protocol to allow seamless, effortless data\r
+   dissemination on the Net.\r
+\r
+         | mirror-based   peer-assisted        peer-to-peer\r
+   ------+----------------------------------------------------\r
+   data  | SunSITE        CacheLogic VelociX   BitTorrent\r
+   VoD   | YouTube        Azureus(+seedboxes)  SwarmPlayer\r
+   live  | Akamai Str.    Octoshape, Joost     PPlive\r
+                    TABLE 1. Usecases.\r
+\r
+   The protocol must be designed for maximum genericity, thus focusing\r
+   on the very core of the mission, contain no magic constants and no\r
+   hardwired policies. Effectively, it is a set of messages allowing to\r
+   securely retrieve data from whatever source available, in parallel.\r
+   The protocol must be able to run over IP as an independent transport\r
+   protocol. For compatibility reasons, it must also run over UDP and\r
+   TCP.\r
+\r
+\r
+3.  Design goals\r
+\r
+   The technical focus of the swift protocol is to find the simplest\r
+   solution involving the minimum set of primitives, still being\r
+   sufficient to implement all the targeted usecases (see Table 1),\r
+   suitable for use in general-purpose software and hardware (i.e. a\r
+   web browser or a set-top box).\r
+   The five design goals for the protocol are:\r
+\r
+   1. Embeddable kernel-ready protocol.\r
+   2. Embrace real-time streaming, in- and out-of-order download.\r
+   3. Have short warm-up times.\r
+   4. Traverse NATs transparently.\r
+   5. Pluggability/extensibility.\r
+\r
+   Later in the draft, the objectives are referenced as (1)-(5).\r
+\r
+   device, a browser or even in the kernel space. Thus, the protocol\r
+   must have light footprint, preferably less than TCP, in spite\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 3]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   the necessity to support numerous ongoing connections as well as to\r
+   constantly probe the network for new possibilities. The practical\r
+   overhead for TCP is estimated at 10KB per connection [HTTP1MLN]. We\r
+   aim at <1KB per peer connected. Also, the amount of code necessary\r
+   to make a basic implementation must be limited to 10KLoC of C.\r
+   Otherwise, besides the resource considerations, maintaining and\r
+   auditing the code might become prohibitively expensive.\r
+\r
+   The support for all three basic usecases of real-time streaming,\r
+   in-order download and out-of-order download (2) is necessary for\r
+   the manifested goal of THE multiparty transport protocol as no\r
+   single usecase dominates over the others.\r
+\r
+   The objective of short warm-up times (3) is the matter of end-user\r
+   experience; the playback must start as soon as possible. Thus\r
+   any unnecessary initialization roundtrips and warm-up cycles must be\r
+   eliminated from the transport layer.\r
+\r
+   Transparent NAT traversal (4) is absolutely necessary as at least 60%\r
+   of today's users are hidden behind NATs. NATs severely affect\r
+   connection patterns in P2P networks thus impacting performance and\r
+   fairness [MOLNAT,LUCNAT].\r
+\r
+   The protocol must define a common message set (5) to be used by\r
+   implementations; it must not hardwire any magic constants, algorithms\r
+   or schemes beyound that. For example, an implementation is free to\r
+   use its own congestion control, connection rotation or reciprocity\r
+   algorithms. Still, the protocol must enable such algorithms by\r
+   supplying sufficient information. For example, trackerless peer\r
+   discovery needs peer exchange messages, scavenger congestion control\r
+   may need timestamped acknowledgments, etc.\r
+\r
+\r
+4.  swift subsystems and design choices\r
+\r
+   To large extent, swift design is defined by the cornerstone decision\r
+   to get rid of TCP and not to reinvent any TCP-like transports on\r
+   top of UDP or otherwise. The requirements (1), (4), (5) make TCP a\r
+   bad choice due to its high per-connection footprint, complex and\r
+   less reliable NAT traversal and fixed predefined congestion control\r
+   algorithms. Besides that, an important consideration is that no\r
+   block of TCP functionality turns out to be useful for the general\r
+   case of swarming downloads. Namely,\r
+     1. in-order delivery is less useful as peer-to-peer protocols\r
+     often employ out-of-order delivery themselves and in either case\r
+     out-of-order data can still be stored;\r
+     in-order delivery is not necessary, packet losses might be\r
+     patched up lazily, without stopping the flow of data;\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 4]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+     3. flow control is not necessary as the receiver is much less\r
+     likely to be saturated with the data and even if so, that\r
+     situation is perfectly detected by the congestion control\r
+     4. TCP congestion control is less useful as custom congestion\r
+     control is often needed.\r
+   In general, TCP is built and optimized for a different usecase than\r
+   we have with swarmed downloads. The abstraction of a "data pipe"\r
+   orderly delivering some stream of bytes from one peer to another\r
+   turned out to be irrelevant. In even more general terms, TCP\r
+   supports the abstraction of pairwise _conversations_, while we need\r
+   a content-centric protocol built around the abstraction of a cloud\r
+   of participants disseminating the same _data_ in any way and order\r
+   that is convenient to them.\r
+\r
+   Thus, the choice is to design the protocol that runs on top of\r
+   unreliable datagrams. Instead of reimplementing TCP we create a\r
+   datagram-based protocol, completely dropping the sequential data\r
+   stream abstraction. Ripping off unnecessary features of TCP makes it\r
+   easier both to implement the protocol, and to check/verify it; e.g.\r
+   numerous TCP vulnerabilities were caused by complexity of the\r
+   protocol's state machine. Still, we reserve the possibility to run\r
+   swift on top of TCP or HTTP. The draft itself assumes swift-over-UDP\r
+   implementation; the necessary adjustments to run the protocol over IP\r
+   or TCP a listed in Sec. 5.\r
+\r
+   Pursuing the maxim of making things as simple as possible but not\r
+   simpler, we fit the protocol into the constraints of the transport\r
+   layer by dropping all the transmission's technical metadata except\r
+   for the content's root hash (compare that to metadata files used in\r
+   BitTorrent). Elimination of technical metadata is achieved through\r
+   the use of Merkle [MERKLE,ABMRKL] hash trees, exclusively single-file\r
+   transfers and other techniques. As a result, a transfer is identified\r
+   and bootstrapped by its root hash only.\r
+\r
+   To avoid the usual layering of positive/negative acknowledgment\r
+   mechanisms we introduce a scale-invariant acknowledgment system (see\r
+   Sec 4.4). The system allows for aggregation and variable level of\r
+   detail in requesting, announcing and acknowledging data, serves\r
+   in-order and out-of-order retrieval with equal ease.\r
+   Besides the protocol's footprint, we also aim at lowering the size of\r
+   a minimal useful interaction. Once a single datagram is received,\r
+   it must be checked for data integrity, and then either dropped or\r
+   accepted, consumed and relayed.\r
+\r
+4.1.  The atomic datagram principle\r
+\r
+   loss of one datagram MUST NOT disrupt the flow. Thus, a datagram\r
+   carries zero or more messages, and neither messages nor message\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 5]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   interdependencies should span over multiple datagrams. In particular,\r
+   any data piece is verified using uncle hash chains; all hashes\r
+   necessary for verifying data integrity are put into the same datagram\r
+   as the data (Sec. 4.3). As a general rule, if some additional data is\r
+   still missing to process a message within a datagram, the message\r
+   SHOULD be dropped.\r
+\r
+   Each datagram starts with four bytes corresponding to the receiving\r
+   channel number (Sec. 4.2). The rest of a datagram is a\r
+   concatenation of messages. Each message within a datagram has fixed\r
+   length, depending on the type of the message. The first byte of a\r
+   message denotes its type. Integers are serialized in the network\r
+   (big-endian) byte order. Variable-length messages, free-form text\r
+   or JSON/bencoded objects are not allowed.\r
+   Consider an example of an acknowledgment message (Sec 4.4). It has\r
+   message type of 2 and a payload of a four-byte integer (say, 1); it\r
+   might be written in hex as: "02 00000001". Later in the document, a\r
+   hex-like two char per byte notation is used to represent message\r
+   formats.\r
+\r
+   In case a datagram has a piece of data, a sender MUST always put\r
+   the data message (type id 1) in the tail of a datagram. Such a\r
+   message consists of type id, bin number (see Sec. 4.3) and the\r
+   actual data. Normally there is 1 kilobyte of data, except the case\r
+   when file size is not a multiple of 1024 bytes, so the tail packet\r
+   is somewhat shorter. Example:\r
+   01 00000000 48656c6c6f20776f726c6421\r
+   (This message accommodates an entire file: "Hello world!")\r
+\r
+\r
+4.2.  Handshake and multiplexing\r
+\r
+   For the sake of simplicity, one transfer always deals with one file\r
+   only. Retrieval of large collections of files is done by retrieving\r
+   a directory list file and then recursively retrieving files, which\r
+   might also turn to be directory lists (see Sec. 4.9). To distinguish\r
+   different transfers between the same pair of peers, the protocol\r
+   introduces an additional layer of multiplexing, the channels.\r
+   "Channels" loosely correspond to TCP connections; "content" of a\r
+   single "channel" is a single file. A channel is established with a\r
+   handshake. To start a handshake, the initiating peer needs to know\r
+   (1) the IP address of a peer\r
+   (2) peer's UDP port and\r
+   (3) the root hash of the content (see Sec. 4.5).\r
+   The handshake is made by a HANDSHAKE message, whose only payload is\r
+   a channel number. HANDSHAKE message type is 0. The initiating\r
+   Initiator sends an initiating datagram to a peer:\r
+      00000000  04 7FFFFFFF 1234123412341234123412341234123412341234\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 6]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+      00 00000011\r
+   (to unknown channel, handshake from channel 0x11, initiating a\r
+   transfer of a file with a root hash 123...1234)\r
+\r
+   Peer's response datagram:\r
+      00000011  00 00000022  03 00000003\r
+   (peer to the initiator: use channel number 0x22 for this transfer;\r
+   I also have first 4 kilobytes of the file, see Sec. 4.3)\r
+\r
+   At this point, the initiator knows that the peer really responds;\r
+   for that purpose channel ids MUST be random enough to prevent easy\r
+   guessing. So, the third datagram of a handshake MAY already contain\r
+   some heavy payload. To minimize the number of initialization\r
+   roundtrips, the first two datagrams MAY also contain some minor\r
+   payload, e.g. a couple of HAVE messages roughly indicating the\r
+   current progress of a peer or a HINT (see Sec. 4.7).\r
+      00000022\r
+   (this is a simple zero-payload keepalive datagram consisting of\r
+   a 4-byte channel id only. At this point both peers have the\r
+   proof they really talk to each other; three-way handshake is\r
+   complete)\r
+\r
+   In general, no error codes or responses are used in the protocol;\r
+   absence of any response indicates an error. Invalid messages are\r
+   discarded. Explicit closing of a channel may be achieved by setting\r
+   channel number to zero by a handshake message: 00 00000000.\r
+\r
+   Simple NAT hole punching [SNP] introduces the scenario when both\r
+   parties of the handshake are initiators. To avoid creation of two\r
+   transfers in the case both initiating datagrams get through, both\r
+   peers must then act as responding peers. Thus, once an initiating\r
+   datagram is sent and another initiating "counter"-datagram is\r
+   received, the initiating peer sends a response datagram with the same\r
+   channel id as in the outstanding initiating datagram.\r
+\r
+\r
+4.3.  Generic acknowledgments\r
+\r
+   Generic acknowledgments came out of the need to simplify the\r
+   data addressing/requesting/acknowledging mechanics, which tends\r
+   to become overly complex and multilayered with the conventional\r
+   approach. Take BitTorrent+TCP tandem for example:\r
+\r
+   1. The basic data unit is of course a byte of content in a file.\r
+   2. BitTorrent's highest-level unit is a "torrent", physically a\r
+   2. A torrent is divided into "pieces", typically about a thousand\r
+   of them. Pieces are used to communicate own progress to other\r
+   peers. Pieces are also basic data integrity units, as the torrent's\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 7]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   metadata includes SHA1 hash for every piece.\r
+   3. The actual data transfers are requested and made in 16KByte\r
+   units, named "blocks" or chunks.\r
+   5. Still, one layer lower, TCP also operates with bytes and byte\r
+   offsets which are totally different from the torrent's bytes and\r
+   offsets as TCP considers cumulative byte offsets for all content\r
+   sent by a connection, be it data, metadata or commands.\r
+   6. Finally, another layer lower, IP transfers independent datagrams\r
+   (typically around a kilobyte), which TCP then reassembles into\r
+   continuous streams.\r
+\r
+   Obviously, such addressing schemes need lots of mappings; from\r
+   piece number and block to file(s) and offset(s) to TCP sequence\r
+   numbers to the actual packets and the other way around. Lots of\r
+   complexity is introduced by mismatch of bounds: packet bounds are\r
+   different from file, block or hash/piece bounds. The picture is\r
+   typical for a codebase which was historically layered.\r
+\r
+   To simplify this aspect, we employ a generic content addressing\r
+   scheme based on binary intervals (shortcutted "bins"). The base\r
+   interval is 1KB "packet", the top interval is the complete 2**63\r
+   range.  Till Sec. 4.4.1 any file is considered to be 2**k bytes long.\r
+   The binary tree of intervals is simple, well-understood, correlates\r
+   well with machine representation of integers and the structure of\r
+   Merkle hashes (Sec. 4.4). A novel addition to the classical scheme\r
+   are "bin numbers", a scheme of numbering binary intervals which\r
+   lays them out into a vector nicely. Bin numbering is done in the\r
+   order of interval's "center", ascending, namely:\r
+\r
+               7\r
+         3          11\r
+      1     5     9    13\r
+    0  2  4  6   8 10 12 14\r
+\r
+   The number 0xFFFFFFFF (32-bit) or 0xFFFFFFFFFFFFFFFF (64-bit)\r
+   stands for an empty interval; 0x7FFF...FFF stands for "everything".\r
+   In general, this numbering system allows to work with\r
+   simpler data structures, e.g. to use arrays instead of binary trees\r
+   in many cases. As a minor convenience, it also allows to use one\r
+   integer instead of two to denote an interval. By requiring every\r
+   message to use bin numbers, we enforce genericity.\r
+\r
+   Back to the acknowledgment message. A HAVE message (type 3) states\r
+   that the sending peer obtained the specified bin and successfully\r
+   checked its integrity:\r
+   (got/checked first four kilobytes of a file/stream)\r
+\r
+   The data is acknowledged in terms of bins; as a result, every\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 8]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   single packet is acknowledged logarithmic number of times. That\r
+   provides some necessary redundancy of acknowledgments and\r
+   sufficiently compensates unreliability of datagrams. Compare that\r
+   e.g. to TCP acknowledgments, which are (linearly) cumulative.\r
+   For keeping the state information, an implementation MAY use the\r
+   "binmap" data structure, which is a hybrid of a bitmap and a binary\r
+   tree, discussed in detail in [BINMAP].\r
+   An ACK message (type 2) acknowledges data that was received from\r
+   its addressee; to facilitate delay-based congestion control, an\r
+   ACK message contains a timestamp:\r
+\r
+   02 00000002 12345678\r
+   (got the second kilobyte of the file from you; my microsecond\r
+   timer was showing 0x12345678 at that moment)\r
+\r
+\r
+4.4.  Data integrity and on-demand Merkle hashes\r
+\r
+   The integrity checking scheme is unified for two usecases of\r
+   download and streaming. Also, it works down to the level of a\r
+   single datagram by employing Merkle hash trees [MERKLE]. Peers\r
+   receive chains of uncle hashes just in time to check the incoming\r
+   data. As metadata is restricted to just a single root hash,\r
+   newcomer peers derive the size of a file from hashes. That\r
+   functionalities heavily depend on the concept of peak hashes,\r
+   discussed in Sec. 4.4.1. Any specifics related to the cases of file\r
+   download and streaming is discussed in Sec. 4.4.2, 4.4.3\r
+   respectively.\r
+\r
+   Here, we discuss the common part of the workflow. As a general\r
+   rule, the sender SHOULD prepend data with hashes which are\r
+   necessary for verifying that data, no more, no less. While some\r
+   optimistic optimizations are definitely possible, the receiver\r
+   SHOULD drop data if it is impossible to verify it. Before sending a\r
+   packet of data to the receiver, the sender inspects the receiver's\r
+   previous acknowledgments to derive which hashes the receiver\r
+   already has for sure.\r
+   Suppose, the receiver had acknowledged bin 1 (first two kilobytes\r
+   of the file), then it must already have uncle hashes 5, 11 and so\r
+   on. That is because those hashes are necessary to check packets of\r
+   bin 1 against the root hash. Then, hashes 3, 7 and so on must be\r
+   also known as they are calculated in the process of checking the\r
+   uncle hash chain. Hence, to send bin 12 (i.e. the 7th kilobyte of\r
+   data), the sender needs to prepend hashes for bins 14 and 9, which\r
+   let the data be checked against hash 11 which is already known to\r
+   message itself, i.e.:\r
+\r
+   04 00000009 F01234567890ABCDEF1234567890ABCDEF123456\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010                [Page 9]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   04 0000000E 01234567890ABCDEF1234567890ABCDEF1234567\r
+   (uncle hashes for the packet 12)\r
+   01 0000000C DA1ADA1ADA1A...\r
+   (packet 12 itself)\r
+\r
+   The sender MAY optimistically skip hashes which were sent out in\r
+   previous (still unacknowledged) datagrams. It is an optimization\r
+   tradeoff between redundant hash transmission and possibility of\r
+   collateral data loss in the case some necessary hashes were lost in\r
+   the network so some delivered data cannot be verified and thus\r
+   has to be dropped.\r
+   In either way, the receiver builds the Merkle tree on-demand,\r
+   incrementally, starting from the root hash, and uses it for data\r
+   validation.\r
+\r
+\r
+4.4.1. Peak hashes\r
+\r
+   The concept of peak hashes enables two cornerstone features of swift:\r
+   download/streaming unification and file size proving. Formally,\r
+   peak hashes are hashes defined over filled bins, whose parent\r
+   hashes are defined over incomplete (not filled) bins. Filled bin is\r
+   a bin which does not extend past the end of the file, or, more\r
+   precisely, contains no empty packets. Practically, we use peak\r
+   hashes to cover the data range with logarithmic number of hashes,\r
+   so each hash is defined over a "round" aligned 2^k interval.\r
+   As an example, suppose a file is 7162 bytes long. That fits into\r
+   7 packets, the tail packet being 1018 bytes long. The binary\r
+   representation for 7 is 111. Here we might note that in general,\r
+   every "1" in binary representation of the file's packet length\r
+   corresponds to a peak hash. Namely, for this particular file we'll\r
+   have three peaks, bin numbers 3, 9, 12.\r
+   Thus, once a newcomer joins a swarm, the first peer sending him\r
+   data prepends it with peak hashes; the newcomer checks them against\r
+   the root hash (see Sec 4.4.2).\r
+\r
+   04 00000003 1234567890ABCDEF1234567890ABCDEF12345678\r
+   04 00000009 234567890ABCDEF1234567890ABCDEF123456789\r
+   04 0000000C 34567890ABCDEF1234567890ABCDEF1234567890\r
+   (this sequence of peak hashes proves that a file is 7KB long)\r
+\r
+\r
+4.4.2. Hash trees for files\r
+\r
+   the entire data range (2**63 bytes). Every hash in the tree is\r
+   defined in the usual way, as a SHA1 hash of a concatenation of two\r
+   lower-level SHA1 hashes, corresponding to left and right data\r
+   half-ranges respectively. For example,\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 10]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+                hash_1 = SHA1 (hash_0+hash_2)\r
+   where + stands for concatenation and hash_i stands for Merkle hash\r
+   of the bin number i. Obviously, that does not hold for the\r
+   base-layer hashes, which are normal SHA1 hashes over 1KB data\r
+   ranges ("packets"), except probably for the tail packet, which\r
+   might have less than 1KB of data. The normal recursive formula does\r
+   not apply to empty bins, i.e. bins that have no data absolutely;\r
+   their hashes are just zeros.\r
+\r
+   Lemma. Peak hashes could be checked against the root hash.\r
+   Proof. (a) Any peak hash is always the left sibling. Otherwise, be\r
+   it the right sibling, its left neighbor/sibling must also be\r
+   defined over a filled bin, so their parent is also defined over a\r
+   filled bin, contradiction. (b) For the rightmost peak hash, its\r
+   right sibling is zero. (c) For any peak hash, its right sibling\r
+   might be calculated using peak hashes to the left and zeros for\r
+   empty bins. (d) Once the right sibling of the leftmost peak hash\r
+   is calculated, its parent might be calculated. (e) Once that parent\r
+   is calculated, we might trivially get to the root hash by\r
+   concatenating the hash with zeros and hashing it repeatedly.\r
+\r
+   Informally, the Lemma might be expressed as follows: peak hashes\r
+   cover all data, so the remaining hashes are either trivial (zeros) or\r
+   might be calculated from peak hashes and zero hashes.\r
+\r
+   Thus, once a peer gets peak hashes and checks them against the\r
+   root hash, it learns the file size and it also gets practical\r
+   anchors for building uncle chains during the transmission (as the\r
+   root hash is too high in the sky). A newcomer peer MAY signal it\r
+   already has peak hashes by acknowledging any bin, even the empty one:\r
+\r
+   03 FFFFFFFF\r
+\r
+   Otherwise, the first of the senders SHOULD bootstrap him with all the\r
+   peak hashes.\r
+\r
+\r
+4.4.3. Hash trees for streams\r
+\r
+   In the case of live streaming a transfer is bootstrapped with a\r
+   public key instead of a root hash, as the root hash is undefined\r
+   or, more precisely, transient, as long as new data keeps coming.\r
+   Stream/download unification is achieved by sending signed peak\r
+   hashes on-demand, ahead of the actual data. Similarly to the\r
+   hashes with the necessary (signed) peak hashes.\r
+   Except for the fact that the set of peak hashes changes with the\r
+   time, other parts of the algorithm work as described in 4.4.2 As we\r
+   see, in both cases data length is not known on advance, but derived\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 11]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   on-the-go from the peak hashes. Suppose, our 7KB stream extended to\r
+   another kilobyte. Thus, now hash 7 becomes the only peak hash,\r
+   eating hashes 3, 9 and 12, so the source sends out a signed peak hash\r
+   message (type 7) to announce the fact:\r
+\r
+   07 00000007 1234567890ABCDEF1234567890ABCDEF12345678 SOME-SIGN-HERE\r
+\r
+\r
+4.5.  Peer exchange and NAT hole punching\r
+\r
+   Peer exchange messages are common for many peer-to-peer protocols.\r
+   By exchanging peer IP addresses in gossip fashion, the central\r
+   coordinating entities (trackers) might be relieved of unnecessary\r
+   work. Following the example of BitTorrent, swift features two types\r
+   of PEX messages: "peer connected" (type 5) and "peer disconnected"\r
+   (type 6). Peers are represented as IPv4 address-port pairs:\r
+   05 7F000000 1F40\r
+   (connected to 127.0.0.1:8000)\r
+\r
+   To unify peer exchange and NAT hole punching functionality, the\r
+   sending pattern of PEX messages is restricted. As swift handshake\r
+   is able to do simple NAT hole punching [SNP] transparently, PEX\r
+   messages must be emitted in the way to facilitate that. Namely,\r
+   once peer A introduces peer B to peer C by sending a PEX message to\r
+   C, it SHOULD also send a message to B introducing C. The messages\r
+   SHOULD be within 2 seconds from each other, but MAY and better not be\r
+   simultaneous, leaving a gap of twice the "typical" RTT, i.e.\r
+   300-600ms. The peers are supposed to initiate handshakes to each\r
+   other thus forming a simple NAT hole punching pattern where the\r
+   introducing peer effectively acts as a STUN server. Still, peers\r
+   MAY ignore PEX messages if uninterested in obtaining new peers or\r
+   because of security considerations (rate limiting) or any other\r
+   reason.\r
+\r
+\r
+4.6.  Congestion control\r
+\r
+   swift employs pluggable congestion control. In general, it is\r
+   expected that servers would use TCP-like congestion control schemes\r
+   such as classic AIMD or CUBIC [CUBIC]. End-user peers are expected to\r
+   use weaker-than-TCP (least than best effort) congestion control, such\r
+   as [LEDBAT] to minimize seeding counter-incentives.\r
+\r
+\r
+   While bulk download protocols normally do explicit requests for\r
+   certain ranges of data (e.g. BitTorrent's REQUEST message), live\r
+   streaming protocols quite often do without to save round trips.\r
+   Explicit requests are often needed for security purposes; consider\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 12]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   that BitTorrent can only verify hashes of complete pieces that\r
+   might consist of multiple blocks requested from many peers.\r
+   As swift has no such implications, it is supposed to work both\r
+   ways. Namely, a peer SHOULD send out requested pieces, while it\r
+   also may send some other data in case it runs out of requests or\r
+   on some other reason. To emphasize that, request messages are named\r
+   HINTs; their only purpose is to coordinate peers and to avoid\r
+   unnecessary data retransmission. A peer is supposed to process\r
+   HINTs sequentially. HINT message type is 8.\r
+   08 00000009\r
+   (a peer requests fifth and sixth packets)\r
+\r
+\r
+4.8.  Subsetting of the protocol\r
+\r
+   As the same protocol is supposed to serve diverse usecases,\r
+   different peers may support different subsets of messages. The\r
+   supported subset SHOULD be signaled in the handshake packets.\r
+   The SWIFT_MSGTYPE_RCVD message (type 9) serves exactly this\r
+   purpose. It contains a 32-bit big-endian number with bits set\r
+   to 1 at offsets corresponding to supported message type ids.\r
+   E.g. for a tracker peer which receives only handshakes and\r
+   (root) hashes, sends out handshakes and PEX_ADD messages, that\r
+   message will look like:\r
+   09 00000011\r
+   Peers running over TCP may not accept ACK messages, etc etc.\r
+\r
+\r
+4.9.  Directory lists\r
+\r
+   Directory list files MUST start with magic bytes ".\n..\n\n". The\r
+   rest of the file is a newline-separated list of hashes and file names\r
+   for the content of the directory. An example:\r
+\r
+   1234567890ABCDEF1234567890ABCDEF12345678  readme.txt\r
+   01234567890ABCDEF1234567890ABCDEF1234567  big_file.dat\r
+\r
+\r
+5. Enveloping\r
+\r
+5.1.  IP\r
+\r
+   albeit it has downsides: first NAT/firewall compatibility problems,\r
+   and second the necessity of in-kernel implementation on both ends.\r
+\r
+\r
+5.2.  UDP\r
+\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 13]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+   Currently, swift-over-UDP is the default deployment option.\r
+   Effectively, UDP allows to use IP with minimal overhead, it also\r
+   allows userspace implementations.\r
+   Besides the classic 1KB packet scenario, the bin numbering allows\r
+   to use swift over Jumbo frames/datagrams. Both data and\r
+   acknowledgments may use e.g. 8KB packets instead of "standard"\r
+   1KB. Hashing scheme stays the same.\r
+   Using swift with 512 or 256-byte packets is theoretically possible\r
+   with 64-bit byte-precise bin numbers, but IP fragmentation might be\r
+   a better method to achieve the same result.\r
+\r
+\r
+5.3.  TCP\r
+\r
+   If ran over TCP, the swift becomes functionally equivalent to\r
+   BitTorrent. Namely, most swift messages have corresponding BitTorrent\r
+   messages and vice versa, except for BitTorrent's explicit interest\r
+   declarations and choking/unchoking, which serve the classic\r
+   implementation of the tit-for-tat algorithm [TIT4TAT].\r
+\r
+\r
+6. Security Considerations\r
+\r
+   As any other network protocol, the swift faces a common set of\r
+   security challenges. An implementation must consider the possibility\r
+   of buffer overruns, DoS attacks and manipulation (i.e. reflection\r
+   attacks). Any guarantee of privacy seems unlikely, as the user is\r
+   exposing its IP address to the peers. A probable exception is the\r
+   case of user being hidden behind a public NAT or proxy.\r
+\r
+\r
+7. Extensibility\r
+\r
+7.1. 32 bit vs 64 bit\r
+\r
+   While in principle the protocol supports bigger (>1TB) files, all\r
+   the mentioned counters are 32-bit. It is an optimization, as using\r
+   64-bit numbers on-wire may cost ~2% practical overhead. 64-bit\r
+   version of every message has typeid of 64+t, e.g. typeid 68 for\r
+   64-bit hash message:\r
+   44 000000000000000E 01234567890ABCDEF1234567890ABCDEF1234567\r
+   Once 32-bit message is supported, its 64-bit version MUST be\r
+\r
+\r
+\r
+\r
+\r
+\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 14]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+7.2. IPv6\r
+\r
+   IPv6 versions of PEX messages use the same 64+t shift as in 6.1.1.\r
+\r
+\r
+7.3. Congestion control algorithms\r
+\r
+   Congestion control algorithm is left to the implementation and may\r
+   even vary from peer to peer. Congestion control is entirely\r
+   implemented by the sending peer, the receiver only provides clues,\r
+   such as hints, acknowledgments and timestamps.\r
+\r
+\r
+7.4. Piece picking algorithms\r
+\r
+   Piece picking entirely depends on the receiving peer. The sender peer\r
+   is made aware of preferred pieces by the means of HINT messages, but\r
+   may ignore those hints and send unrequested data.\r
+\r
+\r
+7.5. Reciprocity algorithms\r
+\r
+   Reciprocity algorithms is the sole responsibility of the sender peer.\r
+   Reciprocal intentions of the sender are not manifested by separate\r
+   messages (as BitTorrent's CHOKE/UNCHOKE), as it does not guarantee\r
+   anything anyway (the "snubbing" syndrome).\r
+\r
+\r
+7.6. Different crypto/hashing schemes\r
+\r
+   Once a flavour of swift will need to use a different crypto scheme\r
+   (e.g. SHA-256), a message should be allocated for that. As the root\r
+   hash is supplied in the handshake message, the crypto scheme in use\r
+   will be known from the very beginning. As the root hash is the\r
+   content's identifier, different schemes of crypto cannot be mixed\r
+   in the same swarm; different swarms may distribute the same content\r
+   using different crypto.\r
+\r
+\r
+References\r
+\r
+[RFC2119] Key words for use in RFCs to Indicate Requirement Levels\r
+[HTTP1MLN] Richard Jones. "A Million-user Comet Application with\r
+    Mochiweb", Part 3. http://www.metabrew.com/article/\r
+    a-million-user-comet-application-with-mochiweb-part-3\r
+[MOLNAT] J.J.D. Mol, J.A. Pouwelse, D.H.J. Epema and H.J. Sips:\r
+    "Free-riding, Fairness, and Firewalls in P2P File-Sharing"\r
+[LUCNAT] submitted\r
\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 15]\r
+\f\r
+Internet-Draft                   swift                        April 2010\r
+\r
+\r
+[BINMAP] V. Grishchenko, J. Pouwelse: "Binmaps: hybridizing bitmaps\r
+    and binary trees" http://bouillon.math.usu.ru/articles/\r
+    binmaps-alenex.pdf\r
+[SNP] B. Ford, P. Srisuresh, D. Kegel: "Peer-to-Peer Communication\r
+    Across Network Address Translators",\r
+    http://www.brynosaurus.com/pub/net/p2pnat/\r
+[MERKLE] Merkle, R. A Digital Signature Based on a Conventional\r
+    Encryption Function. Proceedings CRYPTO'87, Santa Barbara, CA,\r
+    USA, Aug 1987. pp 369-378.\r
+[ABMRKL] Arno Bakker: "Merkle hash torrent extension", BEP 30,\r
+    http://bittorrent.org/beps/bep_0030.html\r
+[CUBIC] Injong Rhee, and Lisong Xu: "CUBIC: A New TCP-Friendly\r
+    High-Speed TCP Variant",\r
+    http://www4.ncsu.edu/~rhee/export/bitcp/cubic-paper.pdf\r
+[LEDBAT] S. Shalunov: "Low Extra Delay Background Transport (LEDBAT)"\r
+    http://www.ietf.org/id/draft-ietf-ledbat-congestion-00.txt\r
+[TIT4TAT] Bram Cohen: "Incentives Build Robustness in BitTorrent", 2003,\r
+    http://www.bittorrent.org/bittorrentecon.pdf\r
+\r
+Author's address\r
+\r
+   Victor Grishchenko\r
+   TU Delft\r
+\r
+   Email: victor.grishchenko@gmail.com\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+Grishchenko             Expires October 12, 2010               [Page 16]\r